.data 部分是否加载到内存中?

Does the .data section gets loaded into memory?

我尝试了以下测试以查看在执行程序时是否将 .data 部分加载到内存中:

global _start

section .data
    arr times 99999999 DB 0xAF

section .text
_start:
    jmp _start ; prevent process from terminating

Assemble 和 link:

nasm -f win32 D:\file.asm
link D:\file.obj /OUT:D:\file.exe /ENTRY:start /SUBSYSTEM:CONSOLE

我已经执行了程序,结果如下:

你可以看到程序只占用了276KB的内存,而它有一个大小为99999999字节的数组!

大多数系统上的分页模型会导致包含不需要某种动态链接的二进制文件部分的页面仅在访问时加载 - Windows 也不例外。因此,.data 部分作为二进制文件内存映射到您的进程内存 space,但直到您需要它时才真正换入。默认情况下,进程监视器仅报告实际内存,但您也可以配置列以显示映像中的所有内存。您可能还可以使用编译器选项来更改分页行为,并且如果需要,您始终可以手动重新映射内存(也许将其锁定)。