天天看点

/3GB开关并不能映射一个3GB大小的内存

如果你使用了/3GB,则你得到一个3GB的虚拟地址空间,但这并不意味着你可以映射一个3GB大小的内存块。在这个地址空间中会有一些标准的”空洞”,例如:位于地址空间底部的64KB,以及位于2GB边界的64KB。

而且,系统DLL会继续在它所希望的内存地址加载,这些内存地址通常位于地址空间中的2GB边界下方,另外,进程堆和其他典型的进程结构记录信息也会占用你的虚拟地址空间。结果就是,尽管用户模式的虚拟地址空间接近有3GB,但是并不是所有的可用空间都是连续的。2GB边界附近的空洞会阻止你分配2GB的连续地址空间。

有些人可能会尝试将系统DLL重新定位到其他地址以创建更多空间,但由于多种原因,这不起作用。

首先,当然是它没有摆脱2GB边界附近的64K的间隙。

其次,系统会在你的程序有机会开始运行之前分配其他项目,例如线程信息块和进程环境变量,因此当你的程序开始分配内存时,它想要的空间可能已经被占用。

第三,系统确实需要在所有进程中将某些关键DLL加载到相同的地址。例如,系统调用陷阱必须驻留在固定位置,以便内核模式陷阱处理程序将其识别为有效的系统调用陷阱而不是非法指令。

调试器也需要这样做,以便当你告诉它拦截正在调试的进程时,它可以使用CreateRemoteThread将断点注入进程。

最后

最近我写了个东西

继续阅读