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

Shu*_*eng 5 windows x86 assembly loader portable-executable

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

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

我知道,通过检查,PE 文件的所有内容,直到并包括节头,都完全按照存储在磁盘上的方式映射到内存中。

接下来发生什么?

文件的其余部分是否也被映射(在这里我指的是下图中的图像页面部分),以便整个文件完全像存储在磁盘上一样在内存中,或者加载程序是否比这更具选择性?

在文档中,我发现了以下代码段:

另一个例外是属性证书和调试信息必须放在图像文件的最后,属性证书表紧跟在调试部分之前,因为加载程序不会将它们映射到内存中。但是,关于属性证书和调试信息的规则不适用于目标文件。

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

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

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

在此处输入图片说明

Joh*_*ica 1

查找这些信息就像寻找彩蛋一样,因为当 COFF 描述使用 AT&T 术语时,MS 始终坚持使用自己的术语。

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

这取决于。
节头覆盖的所有节都映射到运行时地址空间。然而, RVA
为 0 的部分不会被映射,因此永远不会被加载。

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

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

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

您可以在 MSDN 上阅读有关 PE 文件(以及更多内容)的所有内容。

您的引用来自文件格式的文档COFF
关键部分是:

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

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

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

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