查看完整版本: 关于虚拟内存和页面文件的问题

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核心编程》

zealotxx 2008-3-4 10:25

用内存虚拟内存就行了,虽然比直接内存慢

megan 2008-3-7 10:26

有这样的软件吗?用内存虚拟硬盘的软件都少的可怜

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又该多大。

等等。。。。。。
页: [1]
查看完整版本: 关于虚拟内存和页面文件的问题