毕业论文终稿(一个简易操作系统的实现)(4)

2019-03-16 19:19

华北电力大学本科毕业设计(论文)

个段的段起始地址(在8086的实模式下,段起始地址是直接存储在段寄存器中),再结合“偏移地址”计算得到线性地址。第二步是可选的,如果采用分页机制,就用MMU来将线性地址映射为物理地址,从而寻址结束。所以,如果没有采用分页管理机制,线性地址空间等于物理地址空间。

选择子(16位):偏移量(32位) 虚拟地址 分段管理机制 分页管理机制 不启用分页管理机制 图 3-1 虚拟地址空间到物理地址空间的映射

32位 线性地址 32位 物理地址

3.1.2 保护机制

为了支持多任务,对各任务实施保护是必要的。保护机制必须有效地实现不同任务之间的保护和同一任务内的保护 3.1.2.1不同任务之间的保护

不同任务之间的保护中的一个重要方面是应用程序之间的保护。是通过把每个任务放置在不同的虚拟地址空间的方法来实现任务与任务之间的隔离,达到应用程序之间保护的目的。虚拟地址到物理地址的映射函数在每个任务中单独定义,随着任务的切换,映射函数也随之切换,这样的机制使得任务A和任务B拥有相同的虚拟地址空间,但是映射到物理空间后,就是两块独立不相干的区域。这样,两个不同的任务,尽管虚拟存储单元地址相同,但实际的物理存储单元地址不同。 3.1.2.2同一任务内的保护

实现在同一任务内的保护需要达到那些目标?怎样实现在同一任务内的保护?为什么要实现在同一任务内的保护?实现在同一任务内的保护,主要目标是区分不同的段的特权级。在一个任务内,可以定义四种执行特权级别,用于限制对任务中段进行访问。一般会按照不同的段中的数据和代码的可信任程度,给予不同的段不同的特权级。例如:具有最高特权级别的数据,只能由最可信任的代码访问;给不重要的数据段和代码段分配比较低的特权级别;具有最低特权级别的数据,可以被任何特权级的代码访问到。

特权级的典型用法如图3-2所示,把操作系统的核心放在0级,操作系统的其余部分(操作系统外围程序)放在1级,中间软件(数据库和办公软件)放在2级,用户的应用程序放在3级。这样安排,使得在0级的操作系统核心有权利访问所有特权级中的所有数据段和代码段,在1级的操作系统其余部分有权利访问除了0级意外的所有代码段和数据段,而在3级中的应用程序只能访问本任务的数据段和代码段。

12

华北电力大学本科毕业设计(论文)

图 2-2 四个特权级的分配

Code of Program 2 Code of Kernel Code of OS Code of OS Data of Program 2 Data of Kernel Data of OS Data of OS Code of Program1 Data of Program 1 3.1.2.3实现“同一任务内的保护”所依赖的机制

在程序运行中,32位保护模式依靠CPL(current privilege level)、DPL(descriptor privilege level)和RPL(requestor privilege level)三种数据结构来实施任务内的特权级保护,这三种数据结构如图3-3所示。

图 3-3 CPL、DPL、RPL的数据结构示意图

这些数据结构的具体解释如下:

a) 当前特权级CPL。当前代码段的选择子中,最低2位为特权级CPL,这表示当前正在运行的程序的特权级。CPL是程序本身的性质所决定的:如果是“操作系统和操作

13

华北电力大学本科毕业设计(论文)

系统核心程序”(如存储器管理程序、任务调度程序、访问控制程序),那么,特权级为0;如果是“操作系统外围的系统程序”(如缓冲区分配程序、外设驱动程序),那么,特权级为1;如果是一些“应用软件”(如数据库、办公软件),那么、特权级为2;如果是用户程序,那么特权级为3。

b) 描述符特权级DPL。每个段的段描述符中,用描述符特权级DPL表示此段的特权级。程序运行时,数据段的DPL在每次被访问时受到检查,以确定程序是否有权访问该数据段。

c) 请求特权级RPL。数据段的段选择子中的最低2位为请求特权级RPL,数据段总是被代码访问的,此时RPL将受到检测,以确定此次访问是否合法。只有当代码段的CPL的级别不低于RPL的时候,才能是访问成功进行。数据段中设置RPL是为了防止特权级低的程序访问特权级高的数据段。

一般情况下,数据段选择子中的RPL和此段描述符中的DPL是相等的,由于在程序运行中,要访问数据时,总是先装入选择子,再由选择子找到段描述符,然后由段描述符找到对应段,所以,提前在装入选择子这一环用RPL进行特权级保护检查,使得保护机制更加快捷。当一个程序访问数据段的时候,其CPL的级别必须高于或等于被访问段的DPL。例如,CPL为0的代码段对任何特权级的数据段都可以访问,而CPL为1的代码段只能访问特权级为1、2、3的数据段。

在程序运行过程当中,除了数据读写操作时进行界限检查之外,当遇到转移指令JMP、中断指令INT、电泳指令CALL、和返回指令RET时,可能因为涉及到不同的段,所以也会进行界限检查。如果是段内转移,则保护模式会检查这些指令的目标地址是否超出了当前代码段的界限,如果是段间转移,则会对目标端的特权级进行检查,只有CPL级别低于或者等于目标端的DPL时,才能实现转移,也就是说,转移,总是往高级别或者相同级别的目标段进行。如此一来,出现了CPL和DPL状态不同的情况,这种情况产生在异常中断和调用INT指令、CALL指令的时候,此时,CPL改成DPL的值,CPL数值减小,级别提高。但是,当执行RET、IRET指令时,情况和执行CALL、INT指令相反,此时,CPL的数值可能会增大,级别降低。

最后,需要注意的是:

a) DPL是“段描述符”提供的,每个段都对应着一个DPL,而CPL和RPL是“选择子”

提供的。

b) CPL对应于代码段,而RPL对应于数据段

c) 一个代码段处于运行过程中,没有发生段间转移时,CPL总是等于DPL

d) CPL为0时,可以访问任何RPL级别的数据段,CPL为1时,只能访问RPL为1、

2、3的数据段。。。以此类推。

14

华北电力大学本科毕业设计(论文)

3.2 分段管理机制

上面讲到存储管理机制和虚拟地址映射物理地址机制,那在32位保护模式下,操作系统具体怎样实现这些机制?这节的主要内容就是:介绍保护模式下的段定义,以及怎样实现由“段选择子”+“段内偏移”构成的“二维虚拟地址”转换为“一维的线性地址”。

3.2.1 段定义

段是实现虚拟地址到线性地址转换机制的基础。在保护方式下,每个段由这三个参数定义:段基地址,段界限,段属性。通俗点说,“段基地址”规定了这个段在“线性地址空间”中的开始地址,“段界限”规定这个段的大小,值得注意的是,在80386保护模式下,段界限仅仅由20位来表示,大家都知道,20位能表达的最大地址是1M,如果是以1B作为单位的话,一个段的最大地址范围是1M*1B = 1MB,显然无法满足程序的需求,而且也体现不出保护模式相对于实模式的优越性,为了解决这个问题,在“段属性”(定义段的三个元素之一)中用一位“粒度位”(用符号G标记)来规定20位段界限的单位,如果G=0表示以1B作为单位,段大小的范围为1B-1M;如果G=1表示以4KB为单位,段大小的范围为4KB-4GB。“段属性”规定了段的主要特性,例如上面提到的“粒度位”,以及段的特权级,这里不详细介绍。

3.2.2 虚拟地址到线性地址的转换机制

由上一个小节可知,由“二维的虚拟地址”到“一维的线性地址”的转换机制可由图3-4所示。

15

图 3-4 由虚拟地址到线性地址的转换机制

华北电力大学本科毕业设计(论文)

3.2.3 虚拟地址到线性地址的转换机制所需要的数据结构和寄存器

3.2.3.1段描述符

上面讲到三个参数可以定义一个段,这三个参数由一个8字节 = 64位的数据结构保存,这个数据结构称作“段描述符”(顾名思义),其中32位表示“段基地址”,20位表示“段界限”,剩下的12位表示“段属性”。为了和上一代的机器兼容,32位的“段基地址”和20位的“段界限”并非连续存放,具体怎样存放,“段属性”中哪一位代表什么,限于论文篇幅,这里不详细介绍。 3.2.3.2(全局和局部)段描述符表

一个任务会涉及到多个段,每个段需要一个描述符来描述,为了方便管理和查询,80386将描述符组织成线性表,由描述符组成的线性表称作“描述符表”。

在80386中一共有三种“描述符”表:全局描述符表GDT(Global Descriptor Table),局部描述符表LDT(Local Descriptor Table),中断描述符表IDT(Interrupt Descriptor Table)。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张,局部描述符表由多张,每个任务可以有一张自己的LDT。

每个描述符表本身形成一个特殊的数据段,这样的特殊数据段最多可以包含8096个描述符。

每个任务的“局部描述符表LDT”含有该任务自己的代码段、数据段、和堆栈段的描述符,也包含该任务所使用的一些“门描述符”,如:“任务门”和“调用门”门描述符。随着任务的切换,系统当前的“局部描述符表LDT”也随之切换。

“全局描述符表GDT”含有每一个任务都有可能或者可以访问的段的描述符,通常包括操作系统所使用的代码段、数据段、堆栈段的描述符,也包含多种特殊数据段描述符,例如各个用于描述任务LDT的特殊数据段。在任务切换时,不切换GDT。

通过LDT可以使各个任务私有的各个段与其他任务隔离,从而达到受保护的目的。通过GDT可以使各个任务都需要使用的段能够被共享。 3.2.3.3段选择子

由上面的内容可知“虚拟地址”是“二维”的,那是哪两个“维”呢?“虚拟地址”是由那两个东西组成的呢?在实模式中,这两个东西一个是保存在段寄存器(CS,DS,SS。。)中的段地址,另一个是段内偏移地址,此时线性地址 = (段寄存器)*16 + 段内偏移。而在保护模式中,“段选择子”代替了保存在段寄存器(CS,DS,SS。。)中的段地址。通俗点说,“段选择子”是一个索引,一个指针,它可以帮助操作系统在“段描述符表”中查找到定义这个段的“段描述符”,从而得到“段描述符”中的“段基地址”,其实到了这个时候,这个“段描述符”中的“段基址地址”,就和实模式中的段寄存器(CS,DS,SS。。)中的段地址有点相似了,但是不同点在于计算线性地址的方式,实模式中,线性地址 = (段寄存器)*16 + 段内偏移,而保护模式中,线性地址 = 段基地址 + 偏移。

“段选择子”长16位,第0位和第1位十请求特权级RPL(Request Privilege Level)

16


毕业论文终稿(一个简易操作系统的实现)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018两会要点:防止因病致贫、因病返贫

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: