如何将ELF文件中的地址转换为物理地址。

4
我知道操作系统会将elf加载到物理内存中。当执行jmp elf-address时,系统会检查TLB并将elf地址转换为物理地址。我困惑的是,elf地址没有段号和页号?操作系统如何将elf地址转换为MMU所需的地址。
我真的很困惑。 我知道Linux会读取ELF头并映射ELF。 当发生页面错误时,内核会将ELF加载到内存中并刷新页表。 但是你知道ELF地址看起来像0x0804900。 如果我们要执行jmp elf-address,内核如何将ELF地址映射到MMU可以使用的地址。 您知道MMU地址是基于段号和页号的。
操作系统是否有一个映射表来查找?当执行jmp elf-address时,操作系统是否首先将elf地址映射到MMU地址? 例如: elf-address <==> MMU-address

1
好问题,特别是在这个ASR时代... - fge
你为什么问?从哪个角度来看:从内核内部还是从用户空间应用程序? - Basile Starynkevitch
我对这个问题获得如此高的分数感到非常惊讶。我认为这并没有展示出对该主题的先前研究。 - Basile Starynkevitch
1
更多的是基于对发生情况的误解。内核并不为MMU转换虚拟地址,而是MMU根据内核为每种情况设置的上下文特定映射来为内核、用户模式程序等转换它们。 - Chris Stratton
1个回答

1

我并不认为当Linux内核execve(2)一些二进制ELF可执行文件时,它会将该文件加载到物理RAM中。

它只是将文件的一些ELF段映射到进程的地址空间中。您可以通过读取伪文件/proc/1234/maps(例如使用cat命令)来了解进程1234的地址空间;尝试运行cat /proc/self/maps命令,它会显示运行该cat的进程的内存映射。

所以基本上execve(2)做的是一些内存映射,就像mmap(2)一样。它设置了MMU,因此对某些东西的初始访问会导致内存地址错误,然后内核会从文件中加载(在需求分页中进行页面调入)一些页面。阅读有关虚拟内存内存管理的文章。

你真的应该读一些书,比如高级Linux编程

正如FGE所评论的那样,存在ASLR的问题。


你的意思是Linux内核将把ELF段映射到虚拟地址,而虚拟地址可以被MMU解析吗? - jianxi sun
请花些时间阅读我给你的参考资料。看起来你对处理器和操作系统内核的工作原理有一些模糊的概念。花些时间阅读几本关于处理器架构和操作系统原理的书籍。 - Basile Starynkevitch
操作系统会查找地图表吗?当执行 jmp elf-address 时,操作系统是否会先将 elf-address 映射到 MMU 地址?例如:elf-address <==> MMU-address。 - jianxi sun
1
这不正确。操作系统必须将可执行文件加载到物理内存中,以便CPU可以执行它。分页只是简单地创建虚拟->物理映射。因此,操作系统读取ELF结构,而ELF知道它想要在哪里,所以操作系统将其加载到物理空间的任何位置,但将其映射到虚拟空间的正确区域。 - Levente Kurusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接