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

2019-03-16 19:19

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

“任务门”中的偏移没有意义。任务的入口点保存在TSS中,利用段间转移指令JMP和段间调用指令CALL,通过任务门可以实现切换。

“中断门”和“陷阱门”分别描述中断和异常处理程序的入口点。“中断门”和“陷阱门”的选择子必须指向代码段描述符,门内的偏移就是对应代码段的入口点偏移。“中断门”和“陷阱门”只有在中断描述符表(IDT)里面才有效。

3.4.3 任务状态段TSS

每个任务有一个任务状态段TSS,用于保存任务的相关信息,在“任务内变换特权级”和“任务之间进行切换”时,要用到这些信息。

通过任务状态段的英文解释可以知道,任务状态段(Task State Segment)是保存一个任务重要信息的特殊段。任务状态段描述符用于描述这样的系统段。任务状态段寄存器TR的可见部分含有当前任务的任务状态段的段选择子,TR的不可见部分(高速缓冲寄存器)含有当前任务状态段的段基地址和段界限。

TSS在任务切换的过程当中起到了非常重要的作用,操作系统通过它实现任务的挂起和恢复。通俗点说,任务切换是指挂起当前正在执行的任务,恢复另一个任务的执行。在任务切换过程中,第一步,处理器中的各个寄存器的值被自动保存到TR所指定的TSS中,通俗来说就是保存现有任务的状态,第二步,下一个任务的TSS的选择子被装入TR,第三步,从TR所指定的TSS中取出各个寄存器的值送到处理器的各个寄存器中,通俗点说就是载入下一个任务的信息。

任务状态段TSS的基本格式如图3-7所示,由图可知,TSS的基本格式由104字节,这104字节的格式是不可改变的,但此外系统软件还可以指定若干附加信息。

图 3-7 TSS的基本格式

22

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

3.5 控制转移

控制转移可以分为两大类:“同一任务内的控制转移”和“任务间的控制转移”(任务切换)。“同一任务内的控制转移”可分为:“段内转移”(“段内转移”与实模式下的转移相似,不涉及特权级变换和任务切换)、“特权级不变的段间转移”、“特权级变化的段间转移”

3.5.1 任务内无特权级变换的转移

段内转移基本与实模式下相似,不涉及到特权级变化和任务切换,这里不过多说明。只有各种形式的段间转移才涉及到特权级变化和任务切换。 3.5.1.1 可以实现“段间转移”的几条指令

与实模式下一样,指令JMP、CALL和RET都具有段间转移的功能,指令INT和IRET总是段间转移(不存在段内转移),此外,中断和异常也会引起段间转移。

这些能够实现段间转移功能的指令被称作为“段间转移指令”。

在保护模式下,段间转移的目标位置由选择子和偏移地址构成,常把它称作是“目标地址指针”。

“段间转移指令JMP”和“段间调用指令CALL”还可以分为段间直接转移和段间间接转移两类:如果JMP和CALL指令中直接含有“目标地址指针”(上面提到的,由选择子和偏移地址构成),那么就是段间直接转移;如果指令中含有指向包含目标地址指针的门描述符或TSS描述符的指针,那么就是段间间接转移,这种指针只有选择子部分优先,这个选择子用来指示调用门、任务门或者TSS描述符,偏移部分没有意义。

实际上,可以简单地总结来说,当JMP和CALL指令所含指针的选择子部分指示的是“代码段描述符”(即普通的存储段,不是系统段描述符和门描述符),那么就是段间直接转移;当选择子部分指示的是“门描述符”或者属于“系统描述符”中的“TSS描述符”,则是段间转移。

3.5.1.2 向目标代码转移的步骤

处理器在执行上一小节说道的“段间转移指令”,从而向目标代码段实施转移的过程中,一般至少要经过如下步骤:

a) 判别目标地址指针内的选择子指示的描述符是否为空描述符。空描述符是GDT中

的第0个描述符,是一个特殊的描述符。目标代码段描述符不能是空描述符。 b) 从全局或者局部描述符表中读出“目标代码段描述符”。由选择子中的TI位确定

是从局部描述符表还是全局描述符表。

c) 根据具体情况,判断描述符类型是否争取,调整RPL。

d) 将目标代码段描述符内的有关内容装载到段寄存器CS的高速缓冲寄存器 e) 判别目标地址指针内的偏移是否超越代码段。目标地址指针内的偏移必须不超过

23

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

目标代码段界限

f) 装载CS段寄存器和指令指针寄存器EIP,CPL存入CS内选择子的RPL字段。 3.5.1.3 任务内无特权级变化的转移的几种实现方式

所谓“任务内无特权级变换的转移”是指:在转移到新的代码段时,当前特权级CPL利用“段间转移指令JMP”、“段间调用指令CALL”、“段间返回指令RET”和“INT指令”、a) 利用段间直接转移指令JMP或者CALL。在执行段间转移指令JMP时,如果指令内

所含指针指示一个代码段,那么就直接开始上一小节说明的向目标代码转移的步骤;在执行段间调用指令CALL时,如果指令内的指针指示一个代码段,那么就把返回地址指针压入到堆栈,然后直接开始上面说明的向目标代码转移的步骤。顺利通过这几步,就能完成任务内无特权变化的段间转移。

b) 利用段间返回指令RET。在执行段间返回指令RET时,如果从堆栈中弹出的目标地

址指针指示一个代码段,并且选择子符合RPL = CPL的条件,那么就开始上述的向目标代码转移的步骤。顺利通过这几步,就能完成任务内无特权变化的段间转移。通常情况下,段间返回指令RET和段间调用指令CALL对应出现。再利用段间调用指令CALL以任务内无特权级变换的方式转移到某个子程序之后,在子程序内利用段间返回指令RET以任务内无特权级变换的方式返回主程序。由于调用时无特权级变换,所以返回时也无特权级变化,所以必定满足RPL = CPL。 c) 利用调用门或者其他途径。利用调用门实现任务内如特权级变换的转移和其他途

径的转移在下一小节介绍。

保持不变。

“IRET”指令都可以实现任务内无特权级变化的转移。

3.5.2 任务内不同特权级的变换

在一个任务内,可以存在四种特权级,所以常常会发生不同特权级之间的变换。例如:外层的应用程序调用内层操作系统的例程,以获得必要的诸如内存分配等系统服务,而内层操作系统的例程完成以后,返回到外层应用程序。

在同一任务内,实现特权级从内层到外层变换的普通途径是:使用段间调用指令CALL,通过调用门进行转移;实现特权级从内层到外层变换的普通途径是:使用段间返回指令RET。值得注意的一点是,不能够利用JMP指令实现任务内不同特权级的变换。 3.5.2.1 通过调用门的转移

当段间转移指令JMP和段间调用指令CALL所含指针的选择子指示调用门描述符时,就可以通过调用门的转移。

值得注意的是,CALL指令在最后把目标代码段的指针装入CS和EIP之前,要把原CS和EIP(即返回地址)装入到堆栈。如果没有特权级的变化,堆栈保持不变,返回地址就保存在原堆栈中,如果变换特权级,那么返回地址保存在内层堆栈中。

24

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

3.5.2.2 堆栈切换

在使用CALL指令,通过调用门向内层转移时,不仅特权级发生变化,控制转移到一段新的代码段,而且也切换到内层的堆栈段。从任务状态段TSS的格式可以看出,TSS中包含有指向0级、1级、2级堆栈的指针。在特权级发生向内层变换时,根据特权级使用TSS中相应的堆栈指针对寄存区SS以及ESP进行初始化,建立一个空的内层堆栈。

在建立完了一个空的内层堆栈以后,先把外层堆栈的指针SS以及ESP寄存器的值压入内层堆栈,使得当控制转移向外层返回的时候可以恢复外层堆栈。然后从外层堆栈复制以双字为单位的调用参数到内层堆栈,调用门中的DoubleCount字段值决定了的数量。这些被复制的参数是主程序通过堆栈传递给子程序的实参,在调用之前被压入外层堆栈。通过复制堆栈中的参数,使内层的子程序不需要考虑堆栈的切换,而容易地访问主程序传递过来的实参。最后,调用的返回地址被压入堆栈,以便在调用结束的时候返回。

如图3-8所示,图中描述了在向内层变换时,建立内层堆栈,并从外层堆栈复制两个双字参数到内层堆栈的。图中每项是双字,可见的段寄存器内的选择子被扩展成32位,高16位为0。

要注意的是,无论是否通过调用门,只要是没有发生特权级变换,就不会发生堆栈的切换,切换前后使用一个堆栈。

3.5.2.3 向外层返回

与使用CALL指令通过调用门向内层变换相反,使用RET指令实现向外层返回。段间返回指令RET从堆栈中弹出返回地址,并且可以采用调整ESP的方法,跳过相应的在调用之前压入堆栈的参数(例如图3-8中,返回前,可以修改ESP的值,使之指向“外层ESP”,

25

图 3-8 堆栈切换

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

这样就跳过了“参数2”和“参数1”)。返回地址的选择子指示要返回的代码段描述符,从而确定返回的代码段。选择子的RPL确定返回后的特权级,而不是对应描述符的DPL,这是因为,段间返回指令RET可能使控制返回到一致代码段,而一致代码段可以在DPL规定的特权级以外的特权级执行。

3.5.3 任务间控制转移----“任务切换”

利用段间转移指令JMP或者段间调用指令CALL,通过任务门或者直接通过任务状态段TSS,都可以切换到别的任务。此外,在中断/异常或者执行IRET指令时也可能发生任务切换。

3.5.3.1 “直接通过TSS进行任务切换”和“直接通过任务门进行任务切换”

当段间转移指令JMP或段间调用指令CALL所含指针的选择子指示一个可用任务状态段TSS描述符时,正常情况下就发生从当前任务到由该TSS对应的目标任务的切换。目标任务的入口点由目标任务TSS内的CS和EIP字段所规定的的指针确定,而指令内部的偏移将被丢弃。

另一中进行任务切换的方式是,直接通过任务门进行任务切换。我们知道,任务门内的选择子指示某个任务的TSS描述符。当段间转移指令JMP或段间调用指令CALL所含指针的选择子指示一个任务门时,正常情况下就发生任务切换,也就是从当前任务切换到由任务门内的选择子所指示的TSS描述符对应的任务,也就是目标任务。此时,JMP或CALL指令内的偏移和任务门内的偏移都没有意义。 3.5.3.2 任务切换过程

根据指示目标任务TSS描述符的选择子进行任务切换的一般过程如下:

a) 测试目标任务状态段TSS的界限。TSS用于保存任务的各种状态信息,不同的任务,

TSS中可以由数量不等的其他信息,但根据任务状态段TSS的基本格式,TSS的界限应该大于或等于103。

b) 把寄存器现场保存到当前任务的TSS。把通用寄存器、段寄存器、EIP以及EFLAGS

的当前值保存到当前TSS中。保存的EIP的值是返回地址,指向引起任务切换指令的下一条指令,任务返回后继续执行。但是,LDTR和CR3不被保存入TSS中。 c) 把指示目标任务TSS的选择子装入TR。同时,把对应TSS描述符装入TR高速缓冲

寄存器中。此后,当前任务改称为原任务,目标任务改称为当前任务。 d) 基本恢复当前任务(目标任务)的寄存器现场。根据保存在TSS中的内容,恢复

各通用寄存器、段寄存器、EFLAGS以及EIP。在装入段寄存器的过程中,为了能够正确处理可能发生的异常,只把对应选择子装入各段寄存器。还要装载CR3寄存器。

e) 进行链接处理。

f) 把CR0中的TS标志置为1。将CR0中的TS标志置为1的目的是为了表示已经发生

26


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

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

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

马上注册会员

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