回炉重造之重读Windows核心编程-013-Windows的内存结构

第13章Windows的内存结构

13.1进程的虚拟地址空间

每个进程都有自己的虚拟地址空间,32位下是4GB,指针的寻址范围是0x00000000至0xFFFFFFFF之间的值;64位下是16EB(10的18次方),指针寻址范围是0x0000000000000000至0xFFFFFFFFFFFFFFFF。每个进程都只能访问自己的私有空间。操作系统的内存也是隐藏的。
虽然两个不同的进程A和B都可以访问同样的0x12345678,但是它们访问的是各自的数据结构。
而且,这些都是虚拟地址,不是物理地址空间。

13.2虚拟地址空间如何分区

每个进程的虚拟地址空间都要划分各个分区,根据操作系统的实现方法来划分,不同的Windows内核的分区方式略有不同。

13.2.1NuLL指针分配的分区—适用于Windows2000和Windows98

这个分区使用NULL指针的分配。如果试图读写这个分区,就会发生一个访问违规的情况。

13.2.2MS-DOS/16位Windows应用程序兼容分区—仅适用于Windows98

这个分区用于兼容Windows98,大小是4MB。读写它同样会发生访问违规的情况。

13.2.3用户方式分区—适用于Windows2000和Windows98

进程私有的地址空间,不能被其他线程读写或访问。这样让整个系统更加健壮。
实际情况下可以使用的地址空间还不到进程的地址空间的一半。显然另一半是操作系统需要的,用于内核代码、设备驱动程序代码、设备IO高速缓存、非页面内存池的分配和进程页面表等使用。只有在64的Windows2000下,内核才得到了它要的空间。

  1. 在x86下获取3GB用户方式分区的方式是将/3GB这个开关加到系统的BOOT.INI文件的有关项目中。这还不行,链接程序还要有/LARGEADDRESSAWARE这个开关供 Microsoft 检查。如果链接的时候没有加这个开关,Microsoft将会保留多出来的1GB,防止意外的访问。另外,使用了/3GB之后,内核只能勉强地放入一个1GB的分区,这将减少系统能创建的线程、堆栈和其他资源的数量。而且系统最多使用16GB的RAM,而通常最多可以使用64GB的RAM,因为内核方式没有足够多的虚拟地址空间可以用来管理更多的RAM了。最后,编译DLL是忽略/LARGEADDRESSAWARE这个开关的。
  2. 在64位Windows2000中获得2GB用户方式分区
    1. 当从32位移植到64位的时候,指针还是视为32位地址就会造成访问违规。不过,只要对0x000000007FFFFFFF的高33位是零,这样就可以截断64位地址位32位而不会造成任何影响了。这样用户地址空间有0x80000000这么多,对于大多数应用程序来说已经足够了。
    2. 若一个64位应用程序想要访问它的全部4TB空间,必须使用/LARGEADDRESSAWAR这个链接开关来创建。
      3.end

      13.2.464KB禁止进入的分区—仅适用于Windows2000

      位于用户方式分区的前64KB是禁止进入的,访问它只会导致访问违规。保留它只是为了更容易地实现操作系统。

      13.2.5共享的MMF分区—仅适用于Windows98

      13.2.6内核方式分区—适用于Windows2000和Windows98

      13.3地址空间中的区域

      13.4提交地址空间区域中的物理存储器

      13.5物理存储器与页文件

      13.6保护属性

      13.6.1Copy-On-Write访问

      13.6.2特殊的访问保护属性的标志

      13.7综合使用所有的元素

      13.7.1区域的内部情况

      13.7.2与Windows98地址空间的差别

      13.8数据对齐的重要性

猜你喜欢

转载自www.cnblogs.com/leoTsou/p/12434936.html