ucore操作系统lab2实验报告之理论部分


lab2-------物理内存管理

一、实验基本知识简介
1、x86特权级------段选择子
(1)、在保护模式下,特权级总共有4个,编号从 0(最高特权)到3(最低特权)。三类主
要的资源,即内存、
I/O地址空间以及特权指令需要保护。特权指令如果被用户态的程序所
使用,就会受到保护模式的保护机制限制,导致一个故障中断(
general-protection exception)。
对内存和
I/O端口的访问存在类似的特权级限制。为了更好地理解不同特权级,这里先介绍
三个概念:
CPL:当前特权级(Current Privilege Level)保存在 CS段寄存器(选择子)的最低
两位,
CPL 就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级
别)
   DPL:描述符特权(Descriptor Privilege Level) 存储在段描述符中的权限位,用于
描述对应段所属的特权等级,也就是段本身真正的特权级。
   RPL:请求特权级RPL(Request Privilege Level) RPL保存在选择子的最低两位。 RPL
说明的是进程对段访问的请求权限,意思是当前进程想要的请求权限。RPL 的值由
程序员自己来自由的设置,并不一定
RPL>=CPL,但是当RPL<CPL 时,实际起作用
的就是 CPL 了,因为访问时的特权检查是判断:max(RPL,CPL)<=DPL 是否成立,所
RPL 可以看成是每次访问时的附加限制,RPL=0 时附加限制最小, RPL=3 时附加
限制最大。

(2)、当访问门(中断、调用等)时需要CPL <= DPL[门] & CPL >= DPL[段]
   当访问段(访存等)时需要MAX(RPL,CPL)  <= DPL[段]


2、特权级切换过程-----------中断方式

(1)、特权级0到特权级3的切换

如图所示,硬件会在内核栈中压入Error Code(可选)、 EIP CS EFLAGS,然后方式是构造一个能够返回到ring3的一个栈,通过TRET指令进行寄存器的更新。

(2)、方法同上,由于当前处于用户态,而中断产生后,CPU 会进入内核态,所以存在特权级转换。硬件会在内核栈中压入Error Code(可选)、EIPCS EFLAGSESP(用户态特权级的)、SS(用户态特权级的)(如下图所示),然后跳转到到IDT 中记录的中断号所对应的中断服务例程入口地址处继续执行。

(3)、TSS任务状态段(Task State Segment,简称TSS)。任务状态段(TSS)是位于GDT中的一个系统段描述符。任务状态段是做什么的呢?任务状态段就是内存中的一个数据结构。这个结构中保存着和任务相关的信息。当发生任务切换的时候会把当前任务用到的寄存器内容(CS/ EIP/ DS/SS/EFLAGS...)等保存在TSS 中以便任务切换回来时候继续使用。

(4)、全局描述符表(GDT)保存者TSS的地址,TSS最终会被加载进内存中。其中有一个Task Register 的cache缓存,最终通过基址加上偏移来确定Task所在的具体位置。

3、x86内存管理单元MMU

(一)段机制

段的基地址、界限及保护属性,存储在段的描述符表中,在虚拟—线性地址转换过程中要对描述符进行访问。段描述符又存储在存储器的段描述符表中,该描述符表是段描述符的一个数组。

GDT的建表过程以及页机制的开启如下图

下图中,设置了物理地址与虚拟地址的偏移量,即-0xC0000000,也就是说

Virtual Address=LinearAddress=0xC0000000+Physical Address


(二)、页机制        

在分页内存管理中,一方面把实际物理内存(也称主存) 划分为许多个固定大小的内存块,称为物理页面,或者是页框( page frame);另一方面又把 CPU(包括程序员)看到的虚拟地址空间也划分为大小相同的块,称为虚拟页面,或者简称为页面、页( page)。页面的大小要求是 2 的整数次幂,一般在 256 个字节到 4M 字节之间。在
本书中,页面的大小设定为 4KB。 在 32 位的 x86 中,虚拟地址空间是 4GB,物理地址空间也也是 4GB,因此理论上程序可访问到 1M 个虚拟页面和 1M 个物理页面。软件的每一物理页面都可以放置在主存中的任何地方,分页系统提供了程序中使用的虚地址和主存中的物理地址之间的动态映射。这样当程序访问一个虚拟地址时,支持分页机制的相关硬件自动把 CPU 访问的虚拟地址虚拟地址拆分为页号(可能有多级页号)和页内偏移量,再把页号映射为页帧号,最后加上页内偏移组成一个物理地址,这样最终完成对这个地址的读/写/执行等操作。

下面以二级页表的格式为例


由上图可见,CR3寄存器 的内容是对应页目录表的物理基地址;页目录表可以指定1K 个页表,这些页表可以分散存放在任意的物理页中,而不需要连续存放;每张页表可以指定 1K 个任意物理地址空间的页。存储页目录表和页表的基地址是按 4KB 对齐。具体过程描述如下:

首先, CPU 把控制寄存器 CR3 的高 20 位作为页目录表所在物理页的物理基地址,再把需要进行地址转换的线性地址的最高 10 (22~ 31 )作为页目录表的索引, 查找到对应的页目录表项,这个表项中所包含的高 20 位是对应的页表所在物理页的物理基地址;然后,再把线性地址的中间 10 (12~21 )作为页表中的页表项索引, 查找到对应的页表项,这个表项所包含的的高 20 位作为线性地址的基地址(即页号)对应的物理地址的基地址(即页号);最后, 把页帧号作为 32 位物理地址的高 20 位,把线性地址的低 12 位不加改变地作为 32 位物理地址的低 12 位,形成最终的物理地址。
下面是具体页表项的内容:


总而言之,在建立二级页表并建立正确虚实映射关系的过程中,需要完成的事务主要包括:

①给页目录表动态分配空间,给页表分配空间  
②让页基址寄存器的高20位内容为页目录表的高20位物理地址  
③在虚地址高10位的值为index的页目录项中的高20位填写页表的高20位物理地址,设置有效位  
④在虚地址中10位的值为index的页表项中中的高20位填写物理页地址的高20位物理地址,设置有效位

具体建立页表的过程如下所示:


需要注意的是,在设置完映射关系之后,又取消了第二个映射关系原因是为实现对等映射,更新了GDT表项之后,第二个映射就没有意义了,所以需要unmap。

最后,需要在页表中建立页的映射关系,也是实验的内容之一,实现见实验报告。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值