Win32进程空间
from: http://www.pcvc.net/category/content.asp?sendid=118
Win32的可执行文件在加载后,系统将为它建立一个它自己的虚拟内存空间,即进程空间,其容量达4G。这4G的空间划分为了几个区域,对于win98和win2000是不尽相同的。
Window2000 Windows98
NULL指针分配分区 0x00000000~0x0000ffff 0x00000000~0x00000fff
MS-DOS/Win16兼容分区 无 0x00001000~0x003fffff
用户分区 0x00010000~0x7ffeffff 0x00400000~0x7fffffff
禁止访问分区(64K) 0x7fff0000~0x7fffffff 无
共享(MMF)分区 无 0x80000000~0xbfffffff
内核方式分区 0x80000000~0xffffffff 0xc0000000~0xffffffff
(上表资料来自:《Windows核心编程》)
NULL指针分区是NULL指针的地址范围。对这个区域的读写企图都将引发访问违规。
DOS/WIN16分区是98中专门用于16位的DOS和windows程序运行的空间,所有的16位程序将共享这个4M的空间。Win2000中不存在这个分区,16位程序也会拥有自己独立的虚拟地址空间。有的文章中称win2000中不能运行16位程序,是不确切的。
用户分区是进程的私有领域,Win2000中,程序的可执行代码和其它用户模块均加载在这里,内存映射文件也会加载在这里。Win98中的系统共享DLL和内存映射文件则加载在共享分区中。
禁止访问分区只有在win2000中有。这个分区是用户分区和内核分区之间的一个隔离带,目的是为了防止用户程序违规访问内核分区。
MMF分区只有win98中有,所有的内存映射文件和系统共享DLL将加载在这个地址。而2000中则将其加载到用户分区。
内核方式分区对用户的程序来说是禁止访问的,操作系统的代码与此。内核对象是否也驻留在此?我认为应该是的,因为应用程序不能直接访问内核对象。但是关于这点我没找到有关的叙述,不知哪位大侠有确切的依据?另外要说明的是,win98中对于内核分区本也应该提供保护的,但遗憾的是并没有做到,因而98中程序可以访问内核分区的地址空间。