Virtual Address中ImageBase地址前面是什么?

What is there before ImageBase address in Virtual Address?

我从Microsoft documentation中了解到,64位图像的图像基地址设置为0x140000000,这是可执行文件首次加载到内存中的基地址。

所以我的问题如下

  1. 0x140000000 地址之前的内容和虚拟地址第一页 (0x0000000) 的开始
  2. 首先加载可执行文件是什么意思?是程序的入口(当然不是main函数)还是别的什么

我不知道 64 位默认值这么高的技术原因,也许只是为了确保您的应用程序没有模块中 data/code 的 32 位指针截断错误?需要注意的是,这个默认值来自微软编译器,Windows 本身会接受一个较低的值。 32位应用程序默认为0x00400000,有actual hardware and technical reasons for that.

从 0 开始的第一页在大多数操作系统中都是禁止访问的,以防止出现 de-referencing NULL 指针的问题。前几兆字节可能映射了 BIOS/firmware 或其他遗留内容。

首先加载,这意味着加载程序将从该地址开始将文件映射到内存中。首先是 MZ 部分(DOS header 和存根代码)和 PE header。之后是 PE header.

中列出的各个部分

如今大多数应用程序都在使用 ASLR,因此基地址将是随机的,而不是 PE 中列出的首选地址。 ntdll 和 kernel32 映射在 exe 之前,因此如果您选择它们​​的基地址,您也会被重新定位。

What comes before 0x140000000 address and starting of virtual address first page (0x0000000)

无论在那里分配什么,比如 DLL、文件映射、堆内存,或者这个内存都可以是空闲的。第一页总是进不去

What does it mean by executable first loaded? Is it the entry point of the program (which is of course not the main function) or something else

加载意味着映射到内存中。映射到内存后,解析其导入,将静态链接的DLL映射到内存,执行它们的入口点,然后才到达可执行入口点。如果可执行文件具有 TLS 回调,则可执行文件入口点并不是真正从可执行文件执行的第一个函数。