4

我知道操作系统会将精灵加载到物理内存中。执行时jmp elf-address,系统会检查 tlb 并将 elf-address 转换为物理地址。我很困惑 elf-address 没有段号和页号?os 如何将 elf-address 转换为 MMU 需要的。

我真的很困惑。我知道linux会读取精灵的标题和地图精灵。当页面错误发生时,内核会在内存中加载精灵并刷新页表。但是你知道 elf 地址就像 0x0804900。如果我们想执行 exe jmp elf-address,内核如何将 elf-address 映射到 MMU 可以使用的地址。你知道 MMU 地址是基于段数和页数的。

是否有操作系统会查找的地图表?当 exec 时jmp elf-address,操作系统会先将 elf-address 映射到 MMU 地址吗?例如: elf-address <==> MMU-address

4

1 回答 1

1

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

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

所以基本上什么execve(2)是某种内存映射,就像mmap(2)一样。它设置MMU,因此任何对某些内容的初始访问都会导致内存地址出错,然后内核将从文件中加载(按需分页)一些页面。阅读有关虚拟内存内存管理的信息。

你真的应该读像Advanced Linux Programming这样的书

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

于 2013-01-09T11:59:35.280 回答