《Windows核心编程》之七 - 关于Windows 2000中内存的分区

    注:本文只涉及到Windows 2000,而不涉及Win98。对于Win98,内存的分区与2000的有着截然的差异。 

    1.进程的虚拟地址空间
        在32位应用程序中,进程的虚拟地址空间有着4GB的内存可用。因为32位的指针可以表示0X00000000至0XFFFFFFFF的地址。
        每个进程中的线程可以访问自己进程中内存。属于其它进程的内存相对于线程来说是隐藏的,不能被访问!
        还有一段内存是隐藏的,那就是操作系统所占用的内存。线程不能访问操作系统的数据。但是这对于win98是个例外。
        虚拟内存空间并不是实际的内存中地址。进程A中的虚拟地址0X12345678所映射的实际内存地址并不是进程B中的虚拟地址0X12345678所映射的实际内存,虽然他们的虚拟地址的值都一样。
        所以,在Win32中,实际内存是被映射的!
        另外,并不是所有4GB的虚拟地址空间都可以被访问数据,确切的说,要看虚似内存有没有被映射,如果是,则可以访问 ,如果不是,则出现访问数据违规操作。

    2.虚拟内存中的分区
        分区是为了把一些不同的数据分门别类出来,放在不同的数据区内。那有哪些类别呢?
        (1)NULL指针区:0X00000000-0X0000FFFF
            就是一些为NULL的指针所存放的区域,它的地址空间大小为64K。
            线程读取这64KB的数据是属于违规访问的,所以,我们明白了为什么对于C++要做NULL的指针检查,而不检查有时就会出现违规访问,就像下面代码所示:
int* pnSomeInteger = (int*) malloc(sizeof(int));
*pnSomeInteger = 5;
            如果以上内存分配不成功,则malloc返回NULL,然后下面操作这个指针就会出现违规。

        (2)用户方式:0X00010000-0X7FFEFFFF
            这个地方是放置进程私有代码,数据的地方,另外的进程是无法对这个进程中这段内存的数据进行操作。这样一来,应用程序就不太可能被其它程序所破坏,使系统更加健壮。
        这段内存也是我们程序可以使用的内存区域。他的大小是不到2GB。剩下来的2GB是空给内核地址空间的。

        (3)64KB进入区:0X7FFF00000-0X7FFFFFFF
            又是线程所不能访问的区域,为什么创建这块区域,书上说的是这样的:M i c r o s o f t之所以保留该分区,是因为这样做将使得M i c r o s o f t能够更加容易地实现操作系统。当将内存块的地址和它的长度传递给Wi n d o w s函数时,该函数将在执行它的操作之前使内存块生效。
            有点不明白?是吗?

        (4)内核方式分区:0X80000000-0XFFFFFFFF
               存放操作系统的代码,用于线程调度,内存管理,文件系统支持,网络支持和所有设备的驱动程序。
                驻留在这儿的数据可被所有的进程分享。
posted @ 2005-09-05 10:41  shipfi  阅读(587)  评论(2编辑  收藏  举报