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

2019-03-16 19:19

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

用于特权检查;第2位是引用描述符表指示位TI(Table Indirector),TI = 0指示从全局描述符表GDT中读取段描述符,TI = 1指示从局部描述符表LDT中读取段描述符;第3至15位一共13位用来指示“描述符索引”,由于每个描述符在描述符表中占据8个字节,所以,如果屏蔽掉段选择子的低三位(即令低三位为0),刚好可以得到当前描述符相对于第一个描述符的偏移地址,这或许是安排选择子高13位作为“描述符索引”的原因。

一共有13位作为选择子的“描述符索引”,所以一个描述符表中,最多有8096个描述符。

所以,总结来说就是,“二维的虚拟地址” = “选择子:偏移地址”,“选择子”+“段描述符表”得到“段描述符”,从“段描述符”得到“段基地址”,由“段基地址”和“偏移地址”就可以就算出线性空间中的“一维的线性地址”。 3.2.3.4段描述符高速缓冲寄存器

从上述叙述可知,在保护模式下,每一次由“虚拟地址”映射为“线性地址”时,都必须使用“选择子”查询“描述符表”来得到段描述符中的基地址。为了避免每一次存储器访问时,都要访问描述符表,从80286开始,每个段寄存器都配有一个高速缓冲寄存器,称之为“段描述符高速缓冲寄存器”或称为“描述符投影寄存器”,这个寄存器的存在对程序员来说是不可见的。

其工作原理为:每当把一个“选择子”装入到某个段寄存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息装入到对应的高速缓冲寄存器中,此后在对该段访问时,处理器都是用对应高速缓冲寄存器中的描述符信息,而不用再从描述符表中取描述符。而绝大多数情况下,对存储器的访问都是在“对应选择子”装入到段寄存器之后进行的,所以,使用段描述符高速缓冲寄存器可以得到很好的执行效果。

3.3 分段管理机制所依赖的两类寄存器

上面的内容对80386的保护模式下的分段管理机制做了详细说明,但是有几点疑问,CPU靠什么来控制这些机制的实施?例如,怎么设置CPU,让其运行在实模式下或者保护模式下?还有,上面提到了可以保存8096个描述符的描述符表,这个表到底在内存的哪里,CPU怎么找到保存这个表的特殊数据段?

要回答这些问题,必须搞明白的一点是,为了使得分段管理机制的实施,CPU必须知道人们到底想让它“干什么”和“怎么干”。而通过设置“控制寄存器”,可以让CPU知道自己“走什么路”,按什么方式运行;通过设置“系统地址寄存器”,可以给予CPU一些实施这个机制必须的数据。

下面就对这两类寄存器进行详细说明。

3.3.1 控制寄存器

控制寄存器包含四个32位的寄存器,分别命名为CR0,CR1,CR2,CR3。

17

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

CR0的第0位为PE位,第31位为PG位,这两个控制位控制分段和分页管理机制,所

以称之为“保护控制位”。PE控制分段管理机制,PE = 0,处理器运行于实模式,PE = 1,处理器运行于保护模式。PG控制分页管理机制,PG = 0,禁用分页管理机制,此时“线性地址”等同于“物理地址”,PG = 1,启用分页管理机制,此时“线性地址”通过内存中的MMU转化为“物理地址”。CR0中的第1至4位为MP(算数存在位)、EM(模拟位)、TS(任务切换位)、ET(扩展类型类),它们共同控制浮点协处理器的操作,所以称为“协处理器控制位”。

CR1被保留,供以后的开发的处理使用,在80386中不能使用CR1,否则引起无效指令操作异常。CR2和CR3用于分页管理机制使用,由于这次的操作系统没有用到分页管理,限于论文篇幅,这里不做介绍。

3.3.2 系统地址寄存器

“全局描述符表GDT”、“局部描述符表LDT”和“中断描述符表IDT”在上文已经有所有讲述,这三个描述符表是保护模式下非常重要的数据结构,它们被保存在特殊数据段里,但是操作系统怎样快速地定位,找到它们,这就用到了“系统地址寄存器”。

一般来说,要定义一个段需要三个参数,段基地址、段大小、段属性,而由于这三个表太过于“著名”且“地位特殊”,已经不需要太多的“段属性”来对他们进行说明,所以,“系统地址寄存器”只负责告知这些特殊数据段的基地址和界限(即大小)。

这些“系统地址寄存器”包括“全局描述符表寄存器GDTR”(GDT Register)、“局部描述符表寄存器LDTR”(LDT Register)、“中断描述符表寄存器IDTR”(IDT Register)、任务状态段寄存器TR(TTS Register)。

图 3-5 控制寄存器和系统地址寄存器

18

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

3.3.2.1 全局描述符表寄存器GDTR

如图3-6所示,GDTR长48位,其中高32位作为基地址,低16位作为界限。GDTR中的段界限以1B为单位,由于段选择子中用13位作为描述符索引,所以一个描述符表最多有2的13次方个段描述符,每个段描述符占用8B空间,所以,用16位作为界限足够。通常对于含有N个描述符的描述符表的段界限应该设置为8*N – 1。

图 3-6 GDTR中的基地址和界限

3.3.2.2 局部描述符表寄存器LDTR

局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDT,如图所示,由程序实际上,每个任务的局部描述符表作为系统的一个特殊段,由一个全局描述符描述(当员可见的16位的寄存器和32位的程序员不可见的高速缓冲寄存器组成。

然其实没有“全局描述符”这个说法),这个全局描述符存放在GDT中。在初始化或任务切换过程中,把指示描述当前任务或者切换后任务LDT的描述符的选择子装入到LDTR(即上面提到的程序员可见的16位的寄存器),处理器根据装入LDTR可见部分的选择子,从GDT中去除对应的描述符,并把LDT的基地址和界限等信息保存到LDTR对应的高速缓冲寄存器中(32位的程序员不可见的高速缓冲寄存器)。随后对LDT的访问,既可以根据保存在高速缓冲寄存器中的有关信息进行合法性检查。

LDTR寄存器包含当前任务LDT的选择子,所以,装入到LDTR的选择子必须确定一个位于GDT的位LDT类型的系统段描述符,也就是说,选择子中的TI位必须是0(前面提到过),而且这个描述符的类型字段(属于“段类型”的一部分)所表示的类型必须是LDT。 3.3.2.3 中断描述符表寄存器IDTR

中断描述符表寄存器IDTR指向中断描述符表IDT。如图3-5所示,IDTR长48位,其中32位的基地址规定IDT的基地址,16位的界限规定IDT的段界限。由于80386只支持256个中断+异常,所以IDT表的最大长度为2K。

IDTR指示IDT表的方式与GETR指示GDT表的方式相同。

任务状态段寄存器TR包含指示描述当前任务的任务状态段(TTS)的描述符选择子,

19

3.3.2.4 任务状态段寄存器TR

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

从而规定了当前任务的状态段,任务状态段的格式在后面的任务切换中详细介绍。

如图3-5所示,和LDTR一样,TR也有程序员可见和不可见部分(其实不可见部分都是之前讲到过的高速缓冲寄存器)。当把任务状态段的选择子装入到TR可见部分时,处理器自动把选择子所指向的描述符中的三个参数信息(段基址地址,段界限,段属性)保存到不可见的高速缓冲寄存器,之后对当前任务状态段的任何访问都可以方便地进行。

和LDTR类似,装入到TR的选择子必须不能为空,必须是指向GDT中的全局描述符,且描述符的类型必须是TSS(任务状态段)。

3.4 系统段描述符、门描述符、任务状态段

经过上一节的叙述,对分段管理机描述符制和支持分段管理机制的数据结构以及寄存器有所了解,但是仍然遗留有几个疑问,任务状态段TSS是什么?LDTR和TR中的选择子(程序员可见的部分)指向的都是GDT中的描述符,这两类描述符和普通的全局描述符有什么不同,各自有什么特点?怎样实现任务之间的切换?又需要什么数据结构或者什么寄存器?任务之间的切换的整个运行原理是怎样的?这是这一节和下一节需要叙述的内容。这一节的重点很集中,就是弄明白任务之间切换的一些基础知识,下一节详细讲述任务之间的切换,这是在80386的保护模式下设计和实现多任务操作系统的关键!!

3.4.1 系统段描述符

系统段是为了实现“存储管理机制”所使用的一种特别的段。在80386中,有两种系统段:“任务状态段TSS”和“局部描述符表LDT段”,用于描述系统段的描述符称为系统描述符,也成为特殊段描述符(这些描述符都在GDT中,这个上面已经详细讲过)。

系统段描述符的一般格式与普通存储段描述符的格式很相似,而区分的标志在于段属性中的DT位,DT = 1表示存储段,DT = 0表示系统段。系统段描述符和普通存储描述符在大多数字段(如段基地址和段界限)意义相同,需要注意的仅仅是段属性中的TYPE字段,其包含4位,其含义与存储段描述符的类型完全不同,详细见表3-1。

表 3-1 系统段描述符TYPE字段编码含义

类型编码 0 1 2 3 4 5 6 7 说明 未定义 可用286TSS LDT 忙的286TSS 286调用门 任务门 286中断门 286陷阱门 20

类型编码 8 9 A B C D E F 说明 未定义 可用386TSS 未定义 忙的386TSS 386调用 未定义 386中断门 386陷阱门 华北电力大学本科毕业设计(论文)

由表3-1可知,只有类型编号为1,2,3,9,B的描述符才是“系统段描述符”,其他类型的描述符都是门描述符,门描述符在下面会得到详解。

一个LDT段描述符用于描述一个任务的局部描述符表(长度不固定),也可以说是一个特殊段,LDT段描述符必须在全局描述符表GDT中才有效。在装载LDTR寄存器时,描述符中的LDT段基地址和段界限等信息被装入LDTR高速缓冲寄存器中。

一个任务状态段TSS(长度固定)用于保存任务的各种状态信息,而一个任务状态段描述符用于描述一个任务状态段TSS。在装载任务状态段寄存器TR时,描述符中的TSS段基地址和段界限等信息被装入TR高速缓冲寄存器中。在任务切换或执行LTR指令时(Load TR,顾名思义,装载TR寄存器),要装载TR寄存器。

利用段间转移指令JMP和段间调用指令CALL,直接通过TSS描述可实现任务切换。

3.4.2 门描述符

为了控制“任务内变换特权级”和“任务之间进行切换”,CPU一般通过“控制门”进行转移。

上一小节提到,系统段描述符的一般格式与普通存储段描述符相比,相当相似,而却分的标志在于段属性中的DT位,DT = 1表示存储段,DT = 0表示系统段。其实即使DT=0,也不完全是系统段描述符,只有当TYPE字段为1,2,3,9,B时,才是系统段描述符,如果TYPE字段为其他的话,这个描述符就是个“门描述符”。

“门描述符”与其他类型的段描述符有些不一样,系统段描述符和普通存储段描述符描述的都是一个段,通过描述符中的三个参数详细地定义和描述一个段,从而让CPU通过这样的存储机制迅速地找到内容。而“门描述符”并不描述某种内存段,而是描述控制转移的入口点,这种描述符好像一个通到另一段代码的“门”,通过这个门,可以实现“任务内特权级的变换”和“任务间的切换”。这种“门描述符”也被称作为“控制门”。

由于“门描述符”的特殊性,这里给出“门描述符”的数据结构: Gate struct ;门结构类型定义 OffsetLow DW 0 ;32位偏移的低16位 Selector DW 0 ;选择子 DoubleCount DB 0 ;双字计数字段 GateType DB 0 ;类型

OffsetHigh DW 0 ;32位偏移的低16位

而由表3-1可知,“门描述符”又可以分为:任务们、调用门、中断门、陷阱门。 “调用门”描述某个子程序的入口,“调用门”内的选择子必须指向代码段描述符,“调用门”内的偏移是对应代码段内的偏移。利用段间调用指令CALL,通过调用门可以实现任务内从外层特权级(低)到内层特权级(高)。

“任务门”指示任务。“任务门”内的选择子必须指向GDT中的任务状态段TSS描述符,

21


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

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

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

马上注册会员

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