门描述符
2016-09-03 16:16
176 查看
下载LOFTER
我的照片书 |
门描述符并不描述某种内存段,而是描述控制转移的入口点。这种描述符好比一个同向另一代码段的门。通过这种门,可实现任务内特权级的变换和任务间的切换。所以,这种门描述符也称为控制门。
1.门描述符的一般格式
门描述符的一般格式如下图所示。门描述符只有位于描述符内偏移5的类型字节与系统段保持一致,也由该字节标示门描述符和系统段描述符。该字节内的P和DPL的意义与其它描述符种中的意义相同。其它字节主要用于存放一个48位的全指针(16位的选择子和32位的偏移量)。根据上图给出的门描述符的结构,可定义如下的门描述符结构类型:
GATE STRUC ;门结构类型定义 OFFSETL DW 0 ;32位偏移的低16位 SELECTOR DW 0 ;选择子 DCOUNT DB 0 ;双字计数字段 GTYPE DB 0 ;类型 OFFSETH DW 0 ;32位偏移的高16位 GATE ENDS
利用门描述符结构类型GATE能方便地在程序中说明门描述符。
例如,下面的门描述符SUBRG描述一个386调用门,门内的选择子是10H,入口偏移是123456H,门描述符特权级是3,双字计数是0。
SUBRG GATE <3456,10H,,8CH+60H,12H>
从上述描述符类型的列表中可见,门描述符又可分为:任务门、调用门、中断门和陷阱门,并且除任务门外,其它描述符还各分成286和386两种。
2.调用门
调用门描述某个子程序的入口。调用门内的选择子必须实现代码段描述符,调用门内的偏移是对应代码段内的偏移。利用段间调用指令CALL,通过调用门可实现任务内从外层特权级变换到内层特权级。在上图所示的门描述符内偏移4字节的位0至位4是双字计数字段,该字段只在调用门描述符中有效,在其它门描述符中无效。主程序通过堆栈把入口参数传递给子程序,如果在利用调用门调用子程序时引起特权级的转换和堆栈的改变,那么就需要将外层堆栈中的参数复制到内层堆栈。该双字计数字段就是用于说明这种情况发生时,要复制的双字参数的数量。
3.任务门
任务门指示任务。任务门内的选择子必须指示GDT中的任务状态段TSS描述符,门中的偏移无意义。任务的入口点保存在TSS中。利用段间转移指令JMP和段间调用指令CALL,通过任务门可实现任务切换。4.中断门和陷阱门
中断门和陷阱门描述中断/异常处理程序的人口点。中断门和陷阱门内的选择子必须指向代码段描述符,门内的偏移就是对应代码段的人口点的偏移。中断门和陷阱门只有在中断描述符表IDT中才有效。现在,我们已经研究了基本的特权级检查以及IDT的组成,在此基础上,就能够引入门描述符了。门描述符为程序提供了一种受控访问具有不同特权级代码段的方式。特别之处还在于它是系统描述符(段描述符中的S标志很清晰地标示这一点)。
我们来看看门描述符的三种类型:
调用门描述符
中断门描述符
陷阱门描述符
这些门描述符由它们的段描述符类型域的编码来标示(参见表3.9)。
表3.9 段描述符类型编码
Bit 11 Bit 10 Bit 09 Bit 08 门 类 型
0 1 0 0 16位调用门描述符
0 1 1 0 16位中断门描述符
0 1 1 1 16位陷阱门描述符
1 1 0 0 32位调用门描述符
1 1 1 0 32位中断门描述符
1 1 1 1 32位陷阱门描述符
这些门描述符可以是16位或32位,例如,如果代码段跳转后必须发生栈切换,这决定了要压入新栈的值是采用16位压入还是采用32位压入的方式存储。
调用门描述符存在于GDT中,调用门描述符的组成与有一些较小调整的段描述符非常相似(参见图3.23)。例如,调用门描述符不是存储32位起始线性地址(如代码或数据段描述符),而是存储16位段选择器和32位偏移地址。
存储于调用门描述符中的段选择器引用了GDT中的一个代码段描述符。调用门描述符中的偏移地址与代码段描述符中的基地址相加来指定目标代码段中例程的线性地址。原始逻辑地址的有效地址未被使用。所以,本质上你所拥有的是GDT中的一个描述符,它指向GDT中的另一个描述符,所指向的描述符接着指向一个代码段(参见图3.24)。
就特权级检查而言,当程序使用调用门跳转至新的代码段时,必须满足两个条件。首先,程序的CPL和调用门的段选择器的RPL必须都小于或等于调用门描述符的DPL。此外,程序的CPL必须大于或等于目标代码段的DPL。
中断门描述符和陷阱门描述符(除了它们的类型域以外)外观和功能都类似于调用门描述符(参见图3.25),区别在于它们驻留在中断描述符表(Interrupt Descriptor Table, IDT)中。中断门和陷阱门描述符都存储段选择器和有效地址。段选择器指定了GDT中的一个代码段描述符。有效地址与存储于代码段描述符中的基地址相加,来为线性地址空间中的中断/陷阱指定处理例程。因此,尽管中断门和陷阱门描述符存在于IDT中,它们最终都使用GDT中的项来指定代码段。
中断门描述符和陷阱门描述符之间仅有的真正区别在于处理器如何操作EFLAGS寄存器里的IF位。具体而言,当使用中断门描述符访问中断处理例程时,处理器会清空IF,相反,陷阱门并不要求改变IF。
而对于中断和陷阱处理例程的特权级检查来说,调用处理例程的程序的CPL必须小于或等于中断或陷阱门的DPL,这种情况只有当处理例程由软件(例如INT指令)调用时才会发生。此外,对于调用门来说,指向处理例程代码段的段描述符的DPL必须小于或等于CPL
相关文章推荐
- Spring容器、Bean配置信息。Bean实现类及应用程序的关系
- No row with the given identifier exists 解决方法
- 我眼中的Window创建/添加/删除/更新过程
- 孤儿进程与僵尸进程[总结]
- 关于编程中的无穷大的一些事
- 架构设计:系统存储(3)——块存储方案(3)
- 对象的三大特性(封装、继承、多态)之------继承性 + 覆写
- 2002年分区联赛普级组之四 过河卒
- 第二十三条:不要在新代码中使用原生类型
- 偏执却管用的10条Java编程技巧
- python中*和**的用法
- JavaScript 冒泡排序和选择排序
- 面试集锦-常量,const, const 对指针的影响
- [POJ2761]Feed the dogs(静态区间第k小,主席树)
- CI框架的自动验证
- 机器学习笔记2-Supervised learning
- 浙江大学 PAT 编程初级2
- JZ3054祖孙询问
- Linux内存管理之mmap详解
- NYOJ 860 又见01背包