关于80386中两级页表的问题

      现在用网络写东西的人越来越多,一方面是将自己遇到的问题和他人探讨,另一方面对遇到类似情况的人也有个借鉴。本着这样的想法,我想借CSDN这个平台,把自己碰到的问题及对此理解,他人的见解,解决办法写下来。 我想,一个有志于成为嵌入式工程师的人,对LINUX的了解是必须的。这两天我也着手看了一些资料。在硬件基础上,遇到了一个问题,不是太清楚,希望懂的高手能指点一下迷津。

 

   以下是我阅读到的原文:

 

两级页表结构

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

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

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

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

我不是太明白为什么要采用二级页表结构。因为从消耗的资源来讲,采用二级页表要比直接把1M个表项存在一张表里要多,多了一个页目录表大小(也就是一页4K)。从上段所述的意思推敲:每个页目录项索引一张页表,则1K个页目录项可索引1K张页表,而每张页表里又有1K个页表项。则它不是也耗了1K*1K*4B = 4M的物理地址。外加一张页目录表(4K)。

我的理解是:如果要把1M个页表项集中放在一个表里,则要把一个页面固定划成4MB,则这样对将来小容量存储是很浪费的,所以它不惜多花一张页面的大小来成全每页4K的大小。再者,顺序索引一张具有1M目录项的表的时间要比索引两张各有1K项目录项的表要多。这也是所谓的以硬件换速度的代价吧。

不知我的理解是否正确,忘高手不吝赐教。

 

页目录项

 

 页目录表,最多可包含1024个页目录项,每个页目录项为4个字节,结构如图。

31~12位是20位页表地址,由于页表地址的低12位总为0,所以用高20位指出页表地址就可以了。

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

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

第二步,用32位线性地址中的A21~A12位作为页表中的页面的索引,将它乘以4,与页表的起始地址相加,形成32位页面地址。

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

 

由于在保护模式下,处理器使用了分页机制,因此,一般的寻址都是以4K倍数为起始地址(32位中的低12位为0),只有在页面中寻址详细地址,才用到低12位。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值