虚拟内存中ELF二进制文件的布局

时间:2016-06-15 18:18:33

标签: unix mapping offset elf virtual-memory

所有现代* nix操作系统都使用虚拟内存概念(带分页)。据我所知,这个虚拟内存概念用于在程序员和真实物理内存之间设置一个抽象层:程序员不必局限于ram大小,他可以将程序视为一个大的连续的数据空间,指令,堆和堆栈(根据该概念操作指针)。当我们编译&链接源代码我们得到存储在HDD上的可执行文件,称为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 ?

您无需回答所有问题或提供详细答案,而是可以为我提供有关该主题的完整阅读材料,谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

取决于系统以及可执行文件告诉加载程序要做什么。

  
      
  1. 什么是首选的基地址以及它在虚拟内存中的外观?
  2.   

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

  
      
  1. RVA和Offset之间有什么区别?
  2.   

RVA是一种用于抵消的搞乱的单因素。不清楚的是,在您的问题中,您所谈论的是什么类型的抵消。页面有字节偏移。 RVA通常是可以跨越页面的加载位置的偏移量。