在windows中,如何在用户模式和内核模式模块之间分配进程地址空间(4 4GB)
当我在进程资源管理器中检查explorer.exe时,较低的2 2GB被用户模式dll占用,较高的3-4 2GB系统进程地址范围由驱动程序(*.sys文件)加载。
所以我的问题是,每个进程的所有这些3-4 4GB的地址范围是共享的,还是每个进程都是重复的?
发布于 2010-09-06 02:39:27
高千兆字节是操作系统内核、所有驱动程序和附加模块以及I/O缓冲区和其他仅用于内核的数据内存的位置。这是由所有进程共享的,实际上必须是内核才能工作。页表位于一个称为超空间的区域中,该区域位于3 GB的边界上,并且是超过2 GB的内存中唯一未在进程之间共享的部分。默认情况下,内核使用第三个3GB,但是如果您构建的程序具有3 3GB的用户模式内存,那么这个区域将属于进程。
这些都是我想不到的,所以请随时纠正我。
发布于 2010-09-06 03:33:56
提供简短的答案:
(虚拟)内存布局取决于您的操作系统。当然,windows的32位和64位版本之间存在差异,但不同版本之间也存在差异。
参见here (MSDN)和here (MS blogger)。
希望这能有所帮助。
发布于 2010-09-07 16:30:06
默认情况下,内核最多使用XP 2 GB,其余2 GB可用于所有程序。在使用/3GB command line witch启动XP时,使用/LARGEADDRESSAWARE标志链接的程序最多可以使用3 GB的虚拟地址空间。
这意味着每个应用程序最多可以管理3 GB。32位窗口可以将内存交换到一个页面文件,并且这个大小很可能会超过4 GB。因此,两个应用程序一起分配的总容量可能远远超过3 3GB。
我刚刚在一台4 GB的XP32位机器上进行了测试。我启动了3个应用程序,每个应用程序使用VirtualAlloc
并使用memset
填充2 GB。任务管理器显示虚拟分配的内存总量为7 GB。这当然是不太实际的。如果这些应用程序中的两个试图同时使用它们的所有内存,那么当系统挂起时,机器将减慢速度,直到感觉到
https://stackoverflow.com/questions/3647151
复制相似问题