我知道操作系统会将 elf 加载到物理内存中。执行时jmp elf-address
,系统将检查tlb并将elf地址转换为物理地址。我很困惑 elf-address 没有段号和页号?操作系统如何将 elf-address 转换为 MMU 需要的地址。
我真的很困惑。
我知道linux会读取elf的标头并映射elf。
当页面错误发生时,内核会将elf加载到内存中并刷新页表。
但你知道 elf 地址类似于 0x0804900。
如果我们想执行jmp elf-address
,内核如何将 elf-address 映射到 MMU 可以使用的地址。
你知道MMU地址是基于段号和页号的。
是否有操作系统要查找的地图表?当执行时jmp elf-address
,os会先将elf-address映射到MMU地址吗?
例如:elf-address <==> MMU-address
我真的不认为 Linux 内核是什么时候执行(2) http://www.kernel.org/doc/man-pages/online/pages/man2/execve.2.html一些二进制 ELF 可执行文件正在将该文件加载到物理 RAM 中。
它只是将文件的一些 ELF 段映射到进程中’地址空间 http://en.wikipedia.org/wiki/Address_space。您可以通过阅读以下内容了解进程 1234 的地址空间:和cat
命令,伪文件/proc/1234/maps
;尝试命令cat /proc/self/maps
它显示了正在运行的进程的内存映射cat
.
那么基本上什么execve(2)
所做的是某种内存映射,例如mmap(2) http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html做。它设置了MMU http://en.wikipedia.org/wiki/Memory_management_unit所以任何对某些东西的初始访问都会出错内存地址 http://en.wikipedia.org/wiki/Memory_address,然后内核将加载(页入请求寻呼 http://en.wikipedia.org/wiki/Demand_paging)文件中的一些页面。阅读虚拟内存 http://en.wikipedia.org/wiki/Virtual_memory & 内存管理 http://en.wikipedia.org/wiki/Memory_management.
你真的应该读这样的书高级Linux编程 http://advancedlinuxprogramming.com/
正如 FGE 评论的那样,存在以下问题:ASLR http://en.wikipedia.org/wiki/ASLR.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)