首页 | 硬件中心 | 数码中心 | 新闻中心 | 成都/重庆 | 评测室 | 应用技巧 | 产品报价 | 产品中心 | 秀图坊 | 活动中心 | 下载 | 城市联盟
发新话题
打印

关于虚拟内存和页面文件的问题

本主题由 real 于 2008-3-4 10:08 设置高亮

关于虚拟内存和页面文件的问题

最近很多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核心编程》

TOP

用内存虚拟内存就行了,虽然比直接内存慢
我真的是太擅长嘲讽了

TOP

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

TOP

引用:
原帖由 real 于 2008-3-4 10:04 发表
最近很多xd问到了能否关闭虚拟内存的问题,几乎成了月经贴
希望对虚拟内存和页面文件有疑问的xd先看看这个帖子

由于Windows的代码封闭,以及本人对windows了解有限,故此文更多的从IA32体系结构去解释页面文件的 ...
还不错,感受一下
似乎可以写些东西

TOP

引用:
原帖由 real 于 2008-3-4 10:04 发表
最近很多xd问到了能否关闭虚拟内存的问题,几乎成了月经贴
希望对虚拟内存和页面文件有疑问的xd先看看这个帖子

由于Windows的代码封闭,以及本人对windows了解有限,故此文更多的从IA32体系结构去解释页面文件的 ...
好文章
似乎可以写些东西

TOP

解释不太好

TOP

发新话题