real 2008-3-4 10:04
关于虚拟内存和页面文件的问题
最近很多xd问到了能否关闭虚拟内存的问题,几乎成了月经贴
希望对虚拟内存和页面文件有疑问的xd先看看这个帖子
由于Windows的代码封闭,以及本人对windows了解有限,故此文更多的从IA32体系结构去解释页面文件的必要性
先解释一下CPU的寻址方式:
在IA32体系结构下,运行于保护模式下的操作系统通过 逻辑地址——线性地址——物理地址 来访问内存。逻辑地址通过分段方式转换成线性地址,而线性地址通过分页方式转换成物理地址,这个属于386保护模式的范畴,windows就是通过该方式实现逻辑地址与物理地址的隔离的。
举个例子:
当我们使用指针new一个对象时,在堆里分配了一段地址空间,然后打印出这个地址来如:
CPoint* pPt = new CPoint;
printf("%d",pPt);
此时,得到的是线性地址,并不是物理地址。
程序访问地址的方式:
在实模式下,我们通过 段寄存器:偏移 来访问物理地址,此时段寄存器中存放的是实际物理地址的段,即通过 段地址*16+偏移 得到物理地址。
在保护模式下,我们同样通过 段寄存器:偏移 来访问地址,但此时段寄存器中存放的并不是实际物理地址的段,而是LDT或者是GDT中的一个索引(段选择子),该索引中描述了所要引用的段,通过这种方式得到线性地址。
操作系统把4k大小的内存分成一个页面,通过两级索引,将线性地址映射到物理地址上。当进程访问某个页面时,如果该页面不存在,将会触发一个中断,此时CPU将控制权交给操作系统,操作系统从硬盘上找到该页面,加载进内存,返回进程继续执行。
正是通过这两重机制,实现了对物理地址的保护(当然,这两重机制只是实现保护中的一环,必须配合特权级才能完全实现保护)。
禁用页面文件很容易做到,将cr0寄存器的PG位置0就行了,三行代码就能实现:
mov ax,cr0
and ax,01111111b
mov cr0,ax
但windows如何保证LDTR和GDTR映射的段真正存在呢?
举个例子
某个进程需要访问2G以外的线性地址(我们知道在32位环境下,指针的大小为4个字节,也就是int型,可供访问2的32次方也就是4G的虚拟地址,故完全是有可能访问2G以外的空间的),此时,如果分页机制启用了,CPU发现找不到这个物理地址,中断,操作系统根据一定的算法在内存中找一个此时不需要的内存段,将该段中的内容保存到硬盘上去,然后将2G以外的这个线性地址映射到该块物理内存上。但如果此时分页机制关闭了,此时线性地址将于物理地址一一对应,而该物理地址又不存在,故将直接导致地址访问发生错误。
比较肤浅的解释了一下,对此有兴趣的朋友不妨参考一下下列书籍:
《保护模式下的386编程》、《操作系统——设计与实现》以及《windows核心编程》
meteormatt 2008-3-11 11:17
[quote]原帖由 [i]real[/i] 于 2008-3-4 10:04 发表 [url=http://itbbs.pcshow.net/redirect.php?goto=findpost&pid=5211543&ptid=350935803][img]http://itbbs.pcshow.net/images/common/back.gif[/img][/url]
最近很多xd问到了能否关闭虚拟内存的问题,几乎成了月经贴
希望对虚拟内存和页面文件有疑问的xd先看看这个帖子
由于Windows的代码封闭,以及本人对windows了解有限,故此文更多的从IA32体系结构去解释页面文件的 ... [/quote]还不错,感受一下
meteormatt 2008-5-14 21:15
[quote]原帖由 [i]real[/i] 于 2008-3-4 10:04 发表 [url=http://itbbs.pcshow.net/redirect.php?goto=findpost&pid=5211543&ptid=350935803][img]http://itbbs.pcshow.net/images/common/back.gif[/img][/url]
最近很多xd问到了能否关闭虚拟内存的问题,几乎成了月经贴
希望对虚拟内存和页面文件有疑问的xd先看看这个帖子
由于Windows的代码封闭,以及本人对windows了解有限,故此文更多的从IA32体系结构去解释页面文件的 ... [/quote]
好文章
xwm2721385 2008-6-14 18:00
解释不太好
zeusxp 2008-10-10 17:01
根本看不懂啊。哥哥。
能不能通俗点解释?
比如 XP 下 1G内存 应该设置多大的虚拟内存 2G又该多大。
等等。。。。。。