我知道操作系统会将elf加载到物理内存中。执行jmp elf-address
时,系统将检查tlb并将elf-address转换为物理地址。我很困惑,elf-address没有段num和页面num? os如何将elf-address转换为MMU需要的内容。
我真的很困惑。
我知道linux会读取精灵和地图精灵的标题。
当页面错误发生时,内核会将elf加载到内存中并刷新页面表。
但你知道精灵地址就像是0x0804900。
如果我们想要exe jmp elf-address
,内核如何映射elf-address以解决MMU可以使用的问题。
您知道MMU地址基于段num和页面num。
是否有寻找操作系统的地图表?当exec jmp elf-address
时,os会先将elf-address映射到MMU地址吗?
例如:
elf-address <==> MMU-address
答案 0 :(得分:1)
我真的不认为Linux内核在execve(2)某些二进制ELF可执行文件时正在将该文件加载到物理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&amp; memory management
你真的应该阅读像Advanced Linux Programming
这样的书正如FGE评论的那样,问题是ASLR。