MS加载器将PE文件的哪些部分映射到内存中?

时间:2016-08-31 14:09:58

标签: windows assembly x86 loader portable-executable

MS加载程序将PE文件的哪些部分映射到内存中?

从PE文档中,我可以推断出PE可执行文件的典型格式(见下文)。

我知道,通过检查,PE文件的所有内容(包括节标题)都完全映射到内存中,与存储在磁盘上一样。

接下来会发生什么?

文件的其余部分是否也被映射(这里我指的是下图中的图像页面部分),这样整个文件在内存中就像存储在磁盘上一样,或者加载器比那更具选择性?< / p>

在文档中,我找到了以下代码段:

  

另一个例外是属性证书和调试信息   必须使用属性放置在图像文件的最末端   证书表紧接在调试部分之前,因为   loader不会将这些映射到内存中。关于属性的规则   证书和调试信息不​​适用于目标文件,   但是。

这是我能找到的关于装载机行为的全部内容;它只是说这两个部分必须放在文件的最后,因为它们不会进入内存。

但是,如果加载程序加载了除这两部分之外的所有部分,并且我将RVA部分设置为足够高,则部分数据实际上将在内存中复制(一次在映射文件中,一次用于指定的位置) RVA)?

如果可能,请链接到我可以进一步阅读有关特定于MS Windows的加载的地方。

enter image description here

1 个答案:

答案 0 :(得分:2)

查找此信息就像是一次打蛋,因为当COFF描述使用AT&amp; T术语时,MS始终坚持使用自己的术语。

  

MS加载程序将PE文件的哪些部分映射到内存?

取决于 节标题涵盖的所有节都映射到运行时地址空间 但是,RVA为0的部分未映射,因此从未加载。

  

每个调试目录条目标识调试信息块的位置和大小。如果调试信息未被段标题覆盖,则指定的RVA可以是0(即,它驻留在图像文件中并且未映射到运行时地址空间)。如果映射,则RVA是其地址。

内存包含磁盘上文件的精确副本 请注意,可执行文件和dll被映射到虚拟内存中,而不是物理内存! 当您访问时,可执行部分会根据需要交换到RAM中。

如果没有访问某个部分,那么它显然不会被交换到物理RAM,但仍会映射到虚拟内存中。

您可以阅读您可能想知道的所有内容about PE files (and more) on MSDN

您的引语已从documentation of the COFF file format解除 关键部分是:

  

属性证书和调试信息的规则不适用于目标文件。

来自:https://support.microsoft.com/en-us/kb/121460

  

大小:可选标头的大小,包含在可执行文件中但不包含目标文件。目标文件的值应为0。

Ergo:可执行文件或非目标文件,它们是图像文件 因此,规则的例外不适用于它们。