/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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关文章
- java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析
- C#内存映射文件消息队列实战演练(MMF—MQ)
- C语言 mmap()函数(建立内存映射) 与 munmap()函数(解除内存映射)
- 内存管理Memory OC——第九天
- Android 内存监测工具 DDMS --> Heap(转)
- 数字图像处理 使用C#进行图像处理六 内存映射文件
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
- 调用recv(int sockfd, void *buf, size_t len, int flags)的过程中,一共进行了几次内存复制操作?
- QList存储数据释放内存
- 【动画图文深度详解】内存映射文件 mmap 原理深度剖析
- 【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )
- 【Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )
- 【Linux 内核 内存管理】内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )
- 【Linux 内核 内存管理】内存管理系统调用 ② ( mmap 创建内存映射 | mmap 创建内存映射 与 malloc 申请内存对比 | mmap 创建内存映射 与 普通文件操作对比 )
- 【Linux 内核 内存管理】内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )
- 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )
- 【Linux 内核 内存管理】内存映射相关数据结构 ① ( vm_area_struct 结构体 | task_struct、mm_struct、vm_area_struct 3 个结构体之间的关系)
- cpu、内存、磁盘
- 多花费一些内存来提高性能
- Memcache 内存分配策略和性能(使用)状态检查
- 用Valgrind检查内存泄漏