2013-01-09 179 views
4

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

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

有没有一个地图表,os会寻找?而当执行jmp elf-address时,会先将elf地址映射到MMU地址? 如: elf-address <==> MMU-address

+1

好问题,特别是在ASR的这个时代... – fge

+0

你为什么要问?从哪个角度来看:从内核还是从用户应用程序? –

+0

我真的很惊讶这个问题得到这么大的分数。我不觉得它显示了这个问题的前期研究.... –

回答

1

我真的不认为一个Linux内核,当execve(2)一些二进制ELF可执行文件,加载该文件到物理内存。

它只是将文件的一些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问题。

+0

您的意思是说linux内核会将elf段映射到虚拟地址,并且虚拟地址可以被MMU解析? –

+0

请花时间阅读我给你的参考资料。看起来你对处理器和操作系统内核的工作原理有着模糊的想法。花些时间阅读一些关于处理器体系结构和操作系统原理的书籍。 –

+0

有没有一个地图表,os会寻找?而当exec jmp elf-address时,会先将elf地址映射到MMU地址? eg:elf-address <==> MMU-address –