首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

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

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

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

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

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

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《Myth: The /3GB switch lets me map one giant 3GB block of memory》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。

我想:你值得拥有。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210915A082OX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券