2016-06-15 34 views
0

所有现代* nix操作系统都使用虚拟内存概念(使用分页)。据我所知,这种虚拟内存的概念被用来设置程序员和真实物理内存之间的抽象层:程序员不必局限于内存大小,他可以将程序视为一个大的数据,指令,堆栈和栈的连续空间(根据该概念操纵指针)。当我们编译&链接一个源代码时,我们得到一个存储在HDD上的可执行文件,称为ELF,该文件包含除了堆栈和堆大小(仅在运行时创建)等附加信息之外的程序的所有数据和指令。虚拟内存中ELF二进制文件的布局

现在我的问题:

1. How does this binary file (elf) is mapped to virtual memory ? 
    2. Does every process has its own virtual memory (a page file !!!) ? 
    3. What is the program's layout after being mapped to virtual memory ? 
    4. What is exactly the preferred base address and how does it look in virtual memory ? 
    5. What is the difference between a RVA and an Offset ? 

您不必回答所有的问题或给出详细的答案,而不是你能给我提供这个话题好充分的读数,谢谢。

+0

您可能想阅读我撰写关于此的摘要,http://www.gabriel.urdhr。fr/2015/01/22/elf-linking/ – ysdx

+0

你可以在http://stackoverflow.com/questions/33756119/relationship-between-vma-and-elf-segments找到有关ELF文件在内存中映射的信息。 – ysdx

+0

@ysdx thnx,这对我非常有帮助,并且我已经介绍了新的想法。 – afr0ck

回答

0
  1. 这个二进制文件(elf)如何映射到虚拟内存?

可执行文件包含加载程序如何布置地址空间的指令。在某些系统上,部分可执行文件可以映射到内存并用作页面文件。

  1. 每个进程都有自己的虚拟内存(页面文件!!!)吗?

每个进程都有自己的逻辑地址空间。该地址空间内的某些区域可能会与其他进程共享。

  1. 映射到虚拟内存后程序的布局是什么?

这取决于系统和可执行程序告诉装载程序要做的事情。

  1. 什么是首选基地址,它在虚拟内存中的外观如何?

这只是将内容加载到内存中的理想起始位置。大多数编译器生成不与任何特定逻辑地址绑定的可重定位代码。

  1. RVA和Offset之间的区别是什么?

RVA是一种用于偏移的拧入式unixism。什么是不明确的,在你的问题是什么类型的抵消你在谈论。有来自页面的字节偏移量。 RVA通常是可以跨越页面的加载位置的偏移量。

+0

虚拟内存对我来说仍然是一个障碍,我对布局和逻辑 - 物理翻译有所了解,但我仍然在搞虚拟内存的一些东西,我想知道它是如何实现的,如何感觉和操纵虚拟内存东西? – afr0ck

+1

你真的只需要理解这个逻辑内存翻译。虚拟内存大部分是一个单独的问题。 – user3344003