在MMU
并支持virtual memory
的系统上,可以
多个ELFs
同时加载相同的入口点
他们的入口点只是虚拟地址并被翻译成
运行时的物理内存地址。例如,在我的amd64
上
计算机.text
部分始终映射到地址0x00400000
和
_start
始终接近该地址。但它如何在系统上运行
没有 MMU?他们中的许多人可能不支持多任务处理
所有。是开发人员有责任选择ELF入口点
为了使它们不重叠?
答案 0 :(得分:1)
短篇小说,无论如何都无法处理。
现在有一个很长的故事。
ELF不能按原样执行,它是一种带有可执行数据的容器。在具有OS和MMU的系统中,OS创建一个进程以及该进程的相应MMU页表。之后,读取ELF,并根据ELF文件中的数据将可执行代码和数据段(BSS)复制到此新分配的过程存储器中。完成后,将程序计数器设置为入口点地址。您的程序运行。万岁。
要强调的重要一点是,每个进程都有自己的虚拟内存,该虚拟内存映射到唯一的物理内存中。因此,虚拟地址在不同进程中可能重叠或相同,而物理地址在任何给定时刻总是不同的。
现在有一个没有MMU的系统。因此,没有虚拟内存,每个进程都应放置在唯一的物理内存区域中,并链接到该精确的内存区域。
在现实生活中,如果有一些没有MMU ELF文件的小型系统根本就没有使用过。选项1,将所有应用链接到一个大二进制文件中。选项2,使用唯一地址单独链接的应用程序,使用“ objcopy”实用程序提取可执行信息,并将二进制文件复制到系统中以供执行。 “操作系统”应具有启动这些“进程”的入口点列表。