80386内存分页机制

来源:互联网 发布:协同过滤推荐算法java 编辑:程序博客网 时间:2024/04/30 08:48

80386内存分页机制

笔者为在校大学生,水平有限,走过路过的大神勿喷!

80386内存分页机制是实现windows多任务的基础。

首先来了解一下什么是线性地址,什么是物理地址。

所谓线性地址,笔者认为就是CPU能够看到的地址,并不是实际上物理内存的地址空间。而物理地址很容易理解,就是

我们内存中的地址空间,实实在在的东西。

线性地址对于每个程序来说是一样的,都是4GB的大小,但是真正能被应用程序用到的大概就2GB。那我们知道cpu能看到的只是线性地址,而线性地址必须得映射到物理空间上才可以被使用,没错,这里用映射,映射都不陌生,高数里面的函数就是个映射关系。f:线性地址→物理地址。怎么映射,这就是我们要讨论的内存分页机制

了。

内存分页机制——将线性地址转换成物理地址

我们首先假设线性地址为zzzzzzzzH,用32位来表示,内存分页将4GB的物理地址空间分成1G个页面,每个页面大小为4K,也就是说,如果找到是那个页的,然后在页内只用12为来就能够索引到这个页的所有内容,windows就是这样做的,windows直接将线性地址的低12位作为物理地址的低12位来处理,至于高的20位,当然是用来索引这个页了,打个比方说,将物理内存比作一本书,这本书有1GB页,而这本书的每一页都有4K的内容,我们怎么在这4K的内容里面找到特定的内容,首先就是通过页目录找到这本页,因为这本书就有1GB页,我们必须得用20位来才能表示完所有的页码。这里我们虽然说是是页码,但实际上是页的一些属性,我们根据页的这些属性去找页。内存分页机制就是这样来实现由线性地址转换成物理地址的。这里我们还得注意一点,有时候我们通过线性地址无法找到对应映射关系的物理地址,这时候就会出现异常,这时候,操作系统是这样子给我们解决的,首先跳转到异常处理的代码上去执行,如果数据在虚拟内存中,那我们就尽量把虚拟内存中的数据调入内存,再重新映射。跳转回引发异常的指令,这样子指令就可以正常执行下去了。

为了更好的说明,笔者引用罗云彬老师的《windows环境下的32位汇编语言程序设计》一书的两个图。借花献佛,呵呵

由于笔者表达能力有限,技术有限,前辈们多多指教

0 0