设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 14907|回复: 2
打印 上一主题 下一主题

windows底层内存管理技术-2

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-30 23:42:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3 2位Windows 2000的内核与6 4位Windows 2000的内核拥有大体相同的分区,差别在于分区的大小和位置有所不同。另一方面,可以看到Windows 98下的分区有着很大的不同。
NULL指针分配的分区:为了帮助程序员掌握N U L L指针的分配情况。如果你的进程中的线程试图读取该分区的地址空间的数据,或者将数据写入该分区的地址空间,那么C P U就会引发一个访问违规。保护这个分区是极其有用的,它可以帮助你发现N U L L指针的分配情况。一般的c/c++编译器都把NULL设置为0,落在这个分区中。
MS-DOS/16位Windows应用程序兼容分区(仅适用Win98):进程地址空间的这个4MB分区是Windows 98需要的,目的是维护MS - DOS应用程序与16位应用程序之间的兼容性。不应该试图从32位应用程序来读取该分区的数据,或者将数据写入该分区。在理想的情况下,如果进程中的线程访问该内存, CPU应该产生一个访问违规,但是由于技术上的原因, Microsoft无法保护这个4MB的地址空间。
在Windows 2000中,16位MS-DOS与16位Windows应用程序是在它们自己的地址空间(其实是在虚拟机中)中运行的,32位应用程序不会对它们产生任何影响。
16位DOS程序的虚拟机就是cmd,16位windows程序使用的是系统虚拟机。
用户方式分区:这个分区是进程的私有(非共享)地址空间所在的地方。
在Windows 2000中,所有的. e x e和DLL模块均加载这个分区。每个进程可以将这些D L L加载到该分区的不同地址中(不过这种可能性很小)。系统还可以在这个分区中映射该进程可以访问的所有内存映射文件。
在Windows 98中,主要的Win32系统DLL(Kernel32.dll,AdvAPI32.dll,User32.dll和GDI32.dll)均加载共享内存 映射文件分区中。. e x e和所有其他D L L模块则加载到这个用户方式分区中。多个进程的共享D L L均位于相同的虚拟地址中,但是其他DLL可以将这些D L L加载到用户方式分区的不同地址中(不过这种可能性不大)。另外,在Windows 98中,用户方式分区中决不会出现内存映射文件。
在32位windows中,用户分区的最大寻址空间大约为2G,内核寻址空间为 3G。M i crosof t允许x 8 6的Windows 2000 Advanced Server版本和Windows 2000 Data Center版本将用户方式分区扩大为3 G B,内核分区压缩为1G。若要使所有进程都能够使用3 G B用户方式分区和1 G B内核方式分区,必须将/ 3 G B开关附加到系统的BOOT. INI文件的有关项目中。
在x86w/3GB和64位的windows中,若要使用2GB以上的用户空间,该应用程序必须使用/ LARGEADDRESSAWARE 链接开关来创建。
64KB禁止进入的分区(适用于win2k):这个位于用户方式分区上面的64 KB分区是禁止进入的,访问该分区中的内存的任何企图均将导致访问违规。
共享的MMF分区(适用于win98):存放系统DLL、进程共享数据和内存映射文件。
内核方式分区:存放内核代码。用于线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序的代码全部在这个分区加载。驻留在这个分区中的一切均可被所有进程共享。
在Windows 2000中,这些组件是完全受到保护的。如果你试图访问该分区中的内存地址,你的线程将会产生访问违规,导致系统向用户显示一个消息框,并关闭你的应用程序。
在Windows 98中该分区中的数据是不受保护的。任何应用程序都可以从该分区读取数据,也可以写入数据,因此有可能破坏操作系统。
1.3. 地址空间的区域
当进程被创建并被赋予它的地址空间时,该可用地址空间的主体是空闲的,即未分配的。若要使用该地址空间的各个部分,必须通过调用VirtualAlloc函数来分配它里边的各个区域。对一个地址空间的区域进行分配的操作称为保留( reserving )。
每当你保留地址空间的一个区域时,系统要确保该区域从一个分配粒度的边界开始。对于不同的CPU平台来说,分配粒度是各不相同的。几乎所有的CPU平台(x86、32位Alpha、64位Alpha和IA-64)都使用64 KB这个相同的分配粒度。
当你保留地址空间的一个区域时,系统还要 确保该区域的大小是系统的页面大小的倍数。页面是系统在管理内存时使用的一个内存单位。与分配粒度一样,不同的C P U,其页面大小也是不同的。x86使用的页面大小是4 KB,而A l p h a使用的页面大小则是8 KB。IA-64也使用8KB的页面。但是,如果测试显示使用更大的页面能够提高系统的总体性能,那么Microsoft可以切换到更大的页面(16KB 或更大)。
系统有时会直接代表进程保留一些区域,比如用来存放进程环境块PEB和线程环境块TEB。
由于内核会做区域和页面管理,所以它给应用程序保留的区域边界可能不是64k边界。
如果保留区域大小不是页面大小的整数倍,则会圆整到比它大的最近的页面倍数。比如,在x86平台上页面大小为4K,申请保留10k内存时,系统会保留12K内存给你。
不再使用保留区域时,应该调用VirtualFree来释放。
保留区域并不真正分配物理内存,只是占用进程的地址空间而已。
如果要分配物理页面,必须通过调用VirtualAlloc函数来提交保留区域。
2#
发表于 2010-2-25 08:05:11 | 只看该作者
如果一定要用500以上的字来解释“晦涩”这个词,那么LZ是做到了的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 07:31 , Processed in 0.094578 second(s), 10 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表