2.4.1 分页机构

如前所述,分页是将程序分成若干相同大小的页,每页4K字节。如果不允许分页(CR0的最高位置0),那么经过段机制转化而来的32位线性地址就是物理地址。但如果允许分页(CR0的最高位置1),就要将32位线性地址通过一个两级表格结构转化成物理地址。

1. 两级页表结构

为什么采用两级页表结构呢?

80386中页表共含1M表项,每个表项占4字节。如果把所有的页表项存储在一个表中,则该表最大将占4M字节连续的物理存储空间。为避免使页表占有如此巨额的物理存储器资源,故对页表采用了两级表的结构,而且对线性地址的高20位的线性物理地址转化也分为两部完成,每一步各使用其中的10位。

两级表结构的第一级称为页目录,存储在一个4K字节的页面中。页目录表共有1K表项,每个表项为4个字节,并指向第二级表。线性地址的最高10(即位31~32)用来产生第一级的索引,由索引得到的表项中,指定并选择了1K二级表中的一个表。

两级表结构的第二级称为页表,也刚好存储在一个4K字节的页面中,包含1K字节的表项,每个表项包含一个页的物理基地址。第二级页表由线性地址的中间10(即位21~12)进行索引,以获得包含页的物理地址的页表项,这个物理地址的高20位与线性地址的低12位形成了最后的物理地址,也就是页转化过程输出的物理地址,具体转化过程稍后会讲到,如图 2-21 为两级页表结构。


 

                 2.21  两级页表结构

2. 页目录项


2-22的页目录表,最多可包含1024个页目录项,每个页目录项为4个字节,结构如图4.23所示。

2.22 页目录中的页目录项

·      31~12位是20位页表地址,由于页表地址的低12位总为0,所以用高20位指出32位页表地址就可以了。因此,一个页目录最多包含1024个页表地址。

·      0位是存在位,如果P=1,表示页表地址指向的该页在内存中,如果P=0,表示不在内存中。

·     

1位是读/写位,第2位是用户/管理员位,这两位为页目录项提供硬件保护。当特权级3的进程要想访问页面时,需要通过页保护检查,而特权级0的进程就可以绕过页保护,如图2.23 所示。

2.23 U/SR/W提供的保护

·    3位是PWTPage Write-Through)位,表示是否采用写透方式,写透方式就是既写内存(RAM)也写高速缓存,该位为1表示采用写透方式

·    4位是PCDPage Cache Disable)位,表示是否启用高速缓存,该位为1表示启用高速缓存。

·    5位是访问位,当对页目录项进行访问时,A=1

·    7位是Page Size标志,只适用于页目录项。如果置为1,页目录项指的是4MB的页面,请看后面的扩展分页。

·    9~11位由操作系统专用,Linux也没有做特殊之用。

2. 页面项         


80386的每个页目录项指向一个页表,页表最多含有1024个页面项,每项4个字节,包含页面的起始地址和有关该页面的信息。页面的起始地址也是4K的整数,所以页面的低12位也留作它用,如图2.24所示。  

                        2.24 页表中的页面项

31~12位是20位物理页面地址,除第6位外第05位及9~11位的用途和页目录项一样,第6位是页面项独有的,当对涉及的页面进行写操作时,D位被置1

4GB的存储器只有一个页目录,它最多有1024个页目录项,每个页目录项又含有1024个页面项,因此,存储器一共可以分成1024×1024=1M页面。由于每个页面为4K字节,所以,存储器的大小正好最多为4GB

3.  线性地址到物理地址的转换

当访问一个操作单元时,如何由分段结构确定的32位线性地址通过分页操作转化成32位物理地址呢?过程如图2.25所示。


2.25    32位线性地址到物理地址的转换

第一步,CR3包含着页目录的起始地址,用32位线性地址的最高10A31~A22作为页目录的页目录项的索引,将它乘以4,与CR3中的页目录的起始地址相加,形成相应页表的地址。

第二步,从指定的地址中取出32位页目录项,它的低12位为0,这32位是页表的起始地址。用32位线性地址中的A21~A12位作为页表中的页面的索引,将它乘以4,与页表的起始地址相加,形成32位页面地址。

第三步,将A11~A0作为相对于页面地址的偏移量,与32位页面地址相加,形成32位物理地址。

4.扩展分

   从奔腾处理器开始,Intel微处理器引进了扩展分,它允许页的大小为4MB,如图2.26所示:

                                 扩展分页的情况下,页机制32位线性地址分成两个域:最高10位的目录域和其余22位的偏移量。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


2.26 扩展分