Honesty and diligence should be your eternal mates.
分类: LINUX
2010-11-05 10:40:48
三、分页机制:
分页机制主要负责把线性地址转化为物理地址,当然,分页机制最主要的优点是可以把内存分成一小块一小块的页,从而可以防止产生过多的碎片,提高内存利用率。
控制寄存器CR0中的PG位是分页机制的开关,如果PG=1,则启用分页机制,把线性地址转化为物理地址;如果PG=0,则禁用分页机制,分段机制所产生的线性地址直接被当作物理地址使用。分页机制将线性地址空间和物理地址空间分成固定大小的页。物理地址空间的页称为页框。线性地址空间的页可映射到任意物理地址空间的页框,而且线性地址空间的页和物理地址空间的页框的大小必须相等。386体系的页大小为4K,并在页的边界上对齐。4G的空间,每个页面4K,那么我们有1M个页面。分页机制所用的页表项也就有1M个,每个页表项4个字节,我们需要4M的空间来存储页表。为了不开辟连续的4M空间,386采用了两级页表机制。
对于低12位的线性地址,可直接作为物理地址使用。高20位的线性地址,又分了两个部分,每一级页机制使用10位。
第一级,称为页目录,有1K个,每个页目录4个字节,因此占用4K字节的空间,每个页目录里存放着一个页表的首址,因而就有1K个页表。用线性地址的前十位来表示页目录。
第二级就是页表,它有1K个表项,每个表项4个字节,也占用4K字节的空间。线性地址的中间十位来表示页表。这样,总共就有1K*1K=1M个表项,每个表项存放着页面的起始地址。再用该起始地址加上低12位的线性地址,我们就得到了物理地址。
上图为页目录项每一位的使用情况。12 到31位存放的是页表首址。第0位,若P=0,表示没有属于该目录项的页面存在于内存。P=1则相反。第1位和第2位定义了页面的读写权限第3位PWT位,表示是否采用写透方式(既写内存又写高速缓存)。第4位,是否启用告诉缓存。第5位,访问位,当对页目录访问时,该位为1。第7位是页大小标志位,置1指的是采用扩展分页机制,即页面的大小不再是4KB,而是4MB。第9-11位为Linux系统未使用。
页表项每位的作用和页目录的类似,不再赘述。
下面我们看一下整个转换过程:
1、CR3中存放着页目录的起始地址,我们把线性地址的前10位乘以4(每个目录项占4个字节)和该起 始地址相加就得到了页表首址。
2、将线性地址的中间10位作为索引,乘以4,与页表首址相加便得到了页表项的地址。
3、我们从页表项中取出页面首址,与线性地址的低12位相加就得到了物理地址。