参考以下问题
1 How are the different segments like heap, stack, text related to the physical memory?
2 memory allocation in data/bss/heap and stack
3 how does a program runs in memory and the way memory is handled by Operating system
4 How convert address in elf to physical address
特别是在问题1中要求清除的内容仍需要专家评论。
同时不同的答案/评论在相反的方向使这更令人困惑。我们所知道的是,elf被加载到虚拟地址空间中,当需要实际的物理页面时,MMU会为该页面提供进程。我对此有严重怀疑。如果只在虚拟地址中进行映射,那么如何开始执行?一种可能性是来自elf binary的段被加载到虚拟地址空间中,并且还创建了空的页面表,其在每次存储器访问时填充页面错误。在这个人群中,没有ELF二进制文件存储在磁盘上的作用。我可以删除存储在磁盘上的我的精灵而不会影响执行吗?
如果上面的理解是正确的混淆,那就是我们对虚拟内存缺乏了解。由于VM被认为是欺骗,但它似乎不止于此。假设在虚拟空间中加载此行时,int x = 12,则表示在VM中存在x(12)值的记录。当一些指令mov x,第一次执行寄存器时,在RAM中创建一个页面,只给出实际的空间来运行该指令?
在注意到我和其他有类似问题的人的声誉得分后,即使这是基本问题,这个概念至少给我带来了很多困惑。
答案 0 :(得分:1)
如果上述理解是正确的混淆,那就是我们对虚拟记忆缺乏了解。
你所说的理解是不正确,但你的困惑当然似乎主要是关于虚拟内存。虚拟内存系统的要点是允许每个进程访问整个地址空间(或多或少),就像它是唯一运行的进程一样,而不考虑可用的物理RAM量。 "虚拟"并不意味着"假"或者任何这样的事情 - 有一两个警告,如果一个程序分配了虚拟内存,那么它有真正的存储。 "虚拟"部分与任何特定虚拟地址相关的存储的任何给定时间的实际位置有关。
通过将ELF与虚拟内存过于紧密地联系在一起,您似乎也让自己感到困惑。当然,操作系统通常会将ELF可执行文件加载到虚拟内存中(由物理RAM和磁盘的某些组合支持,可能随时间而变化),但它会对它支持的任何其他可执行格式的程序执行相同操作,并且 其他人。
我对此表示严重怀疑。如果只在虚拟地址中进行映射,那么如何开始执行?
操作系统内核是例外 - 它在实内存中运行。为所有正在运行的进程管理虚拟内存是其中一项工作,每个进程的页表都属于它,而不属于进程。内核处理设置和启动进程(包括其页表),并始终知道分配给每个存储的所有存储的实际位置,以及存储映射的虚拟地址。
在这个人群中,没有ELF二进制文件存储在磁盘上的作用。我可以删除存储在磁盘上的我的精灵,而不执行[a]执行?
存储在磁盘上的ELF二进制文件包含程序的可执行代码和数据,该程序将在程序启动时加载到进程的(虚拟)内存中。这是ELF动态链接器(例如ld.linux.so.2
)的工作。当然,启动该程序需要ELF文件。在进程开始之后,确定,磁盘上的ELF二进制文件可以取消链接(例如,通过rm
命令),而不会影响程序的执行,因为它已加载到内存中< / em>(在类Unix系统上; Windows不同,但不支持ELF)。然后,该二进制文件将无法启动该程序的任何新实例。
但请注意,取消链接不一定与删除相同。只要任何进程打开了未链接的文件,它就会在文件系统上保持分配状态。这可能是正在运行的ELF程序的情况,因为一个好的加载策略是将二进制文件的部分映射到内存(例如.text和.rodata部分)。这将保持文件打开,只要具有此类映射的任何进程都处于活动状态,即使二进制文件与文件系统取消链接也是如此。