我知道 os 会在物理内存中加载 Sprite 。当执行 jmp elf-address
时,系统会检查 tlb 并将 elf-address 转换为物理地址。我很困惑 elf-address 没有段号和页号? os 如何将 elf-address 转换为 MMU 需要的内容。
我真的很困惑。
我知道 linux 会读取 elf 和 map elf 的标题。
当页面错误发生时,内核会在内存中加载 Sprite 并刷新页表。
但是你知道 Sprite 地址就像 0x0804900。
如果我们想执行 jmp elf-address
,内核如何将 elf-address 映射到 MMU 可以使用的地址。
您知道 MMU 地址基于段号和页号。
是否有操作系统会查找的 map 表?当 exec jmp elf-address
时,os 会首先将 elf-address 映射到 MMU 地址吗?
例如:elf-address <==> MMU-address
最佳答案
当 execve(2) 一些二进制 ELF 可执行文件时,我真的不认为 Linux 内核正在将该文件加载到物理 RAM 中。
它只是将文件的一些 ELF 段映射到进程的 address space 中。你可以通过阅读来了解进程 1234 的地址空间,例如使用 cat
命令,伪文件 /proc/1234/maps
;尝试命令 cat /proc/self/maps
,它显示运行该 cat
的进程的内存映射。
所以基本上 execve(2)
所做的是某种内存映射,就像 mmap(2) 所做的那样。它设置 MMU 以便对某些内容的任何初始访问都会导致 memory address 出错,然后内核将从文件中加载(在 demand paging 中的页面调入)一些页面。阅读 virtual memory 和 memory management 。
你真的应该读像Advanced Linux Programming这样的书
正如 FGE 评论的那样,存在 ASLR 问题。
关于linux - 如何将elf中的地址转换为物理地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14234448/