IA之32位体系下Linux系统下虚拟地址映射(下)

 在上篇我们讲到段机制实现了逻辑地址到线性地址的映射,接下来检测是否开启分页机制,如果未开启分页机制此时的线性地址就是物理地址;如果开启了分页机制,那么此时的线性地址(虚拟地址)需要经过多级页表映射找到其物理地址。

    在介绍之前我们先认识了解一下CPU中的寄存器,主要分为三类,如下图所示:
 

对于页表映射机制来说根据CPU位数的不同,他们的页表映射级数不同,32位为二级映射,36位为三级映射、64位为四级映射,接下来以32位为例介绍页表映射,主要过程如下图所示:

(1)PG:用高10位表示页目录的下标,所以一共可以表示1024个下标,每个格子存储一个指向其对对应的页表,所以这个PG的大小为1024*4=4k,并且要注意每个格子都对应一个页表;

(2)PT:用中10位表示页表的下标,所以一共可以表示1024个下标,每个格子高20位存储一个物理页面的起始地址和第12位其他关于该页面的属性权限信息,最后一位present位很重要,之后会讲解到;

(3)PP:真实物理页面,并且加上图中低12位的偏移量,就可以访问到数据的真正的物理内存;

所以二级页表映射的流程如下:

(1)从逻辑地址转到线性地址后,检查CR0寄存器中最高位PG的值为1,说明当前操作系统开启了分页机制;

(2)然后从CR3寄存器中找到当前进程页目录表的起始地址,从而定位到页目录表;

(3)读出此时利用虚拟地址32位的特性,计算出高10位的数值,然后从页目录表中找到下标等于此数值所对应的那一项,这一项的ptr指针就指向了当前进程的页表;

(4)继续计算32位中的中10位的值,然后从页表中找下标等于此值的那一项,这一项中就记录了所对应的物理页面的起始地址;

(5)最后在物理页面中,计算32位中低12位的值(物理页面偏移量),上面找到的物理地址+物理页面偏移量=物理地址;

上述就是二级页表映射的流程;需要注意的问题有以下几方面:

(1)在页目录表中,每个表项的指针都对应一个4k的页面,因为每个表项存储的都是一个指向一个4K页面的指针;

(2)在页表中,每个表项都存储一个物理页面,这个物理页面大小为4K;

(3)所以页表映射的大小就是(页目录表 1024)*(页表 1024)*(一个物理页面 4K) = 4G;刚好是系统为一个进程分配的4G虚拟地址空间;

(4)接下来主要讲解页表中的每一个表项(PTE)的主要布局及信息存储,结构如下图所示:
 

在这一步主要就是定位物理页面的信息,主要分为下面三种情况:

每一个PTE的高20位存储物理页面的地址,后12位为该物理页面的属性信息,最后一位present位至关重要,主要定位物理页面有以下三种情况:

value == 0 && present == 0:表示PTE中存储的物理页面还没有被分配过;
value != 0 && present == 0:表示PTE中存储的物理页面被分配过,但是该物理页面在交换分区,此时value存储的是物理页面在磁盘上交换分区的位置;
value != 0 && present != 0:表示PTE锁对应的物理页面是一个活动页面;
同时在存储value值时,只存储了0、1、2、3、.......n的这些类似序号的信息,原因如下图所示:

这也是物理页面称为物理框号的原因。

(5)在Linux操作系统内核中,为我们以页划分物理内存有一个相关的结构体,struct page 又被typedef为meme_map_t类型,这个结构类型定义了一个全局的数组,每个数组都是一个struct page ,描述对应页的信息,并且下标就是对应每页的起始地址,这也是物理框号的应用。
 

总结一:
(1)计算机寻找物理地址主要依靠的是内核提供CR3、页目录值、页表值、GDTR等原材料,硬件MMU(内存管理单元)为我们承担计算了页表映射的过程,包括如何计算页目录表下标、页表下标、检测页表项物理页面的状态等;上述的MMU就是整个页表映射的功能的集合;

(2)虚拟内存是一种内存管理技术,它主要提供的功能是:

提供了内存管理方式:根据LRU最近最久未使用算法进行交换分区与内存的交换;保证物理页面的活动;
给每个进程分配4G的虚拟地址空间
保证每个进程虚拟地址空间的独立;
(3)根据LRU最近最久未使用算法时,只有脏页才会被置换,所谓脏页即就是被修改过的页面。PTE中存在脏页标识,可以快速检测到。

总结二:inter x86体系下  80386以后的段页式管理流程
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值