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