关闭

门描述符

336人阅读 评论(0) 收藏 举报
分类:
 
在系统中除了存储段描述符和系统段描述符外,还有一类门描述符。门描述符并不描述某种内存段,而是描述控制转移的入口点。这种描述符好比一个同向另一代码段的门。通过这种门,可实现任务内特权级的变换和任务间的切换。所以,这种门描述符也称为控制门。其中,门描述符共分为4种分别是,调用门(CallGates),陷阱门(TrapGates),中断门(Interrupt Gates)和任务门(TaskGates)。
任务门指示任务。任务门内的选择子必须指示GDT中的任务状态段TSS描述符,门中的偏移无意义。任务的入口点保存在TSS中。利用段间转移指令JMP和段间调用指令CALL,通过任务门可实现任务切换。
   中断门和陷阱门描述中断/异常处理程序的人口点。中断门和陷阱门内的选择子必须指向代码段描述符,门内的偏移就是对应代码段的人口点的偏移。中断门和陷阱门只有在中断描述符表IDT中才有效。这两种门是用来描述中断和异常的入口的。其只能出现在IDT(中断描述符表)中(对于IDT后面将有详细描述),不能出现在GDT(全局描述符表)和LDT(局部描述符表)中.
这两种门的格式如下表:
门描述符

注:DPL - 描述符特权级
  P - 门有效标志
 D - 门规模(1 = 32位; 0 - 16位)

这里的段选择子用来查找GDT和IDT,得到一个代码段描述符,并最终得到代码段的基地址,再加上图中的偏移量就能够得到中断处理程序的入口了。由于中断处理程序是在当前任务的上下文中运行的,因此可能会出现中断处理程序与被中断程序特权级不一致的问题,这时就会发生堆栈切换。对于由软中断所产生的中断和异常CPU要求,CPL必须小于等于门的DPL。

在整个中断处理程序中,CPU会将TF置成0,以禁止中断处理程序单步执行,并将NT置成0,以在使用IRET指令返回时是回到同一个任务。对于中断门和陷阱门,其就在于对EFLAGS寄存器中IF标志的处理方法不同,当调用中断门时,IF被清除。而调用陷阱门时则不对IF进行处理。

在从中断处理程序返回的过程中,如果当初是通过陷阱门或中断门进入的,则从堆栈顶弹出EIP和CS,以及EFLAGS。然后根据CS寄存器选择子的RPL字段确定返回后的特权级。值得注意的是,如果RPL为一个内层特权级,则将会产生通用保护故障。对于需要提供出错误码的中断处理程序,则必须先人为地从堆栈中弹出出错误码,在执行IRET指令返回。

进入中断和异常还可以通过任务门,即将中断处理程序作为一个任务进行处理,使用该方法即将中断处理程序当成一个任务来看待,对于这种方式的具体操作在以后的文章中会有讨论。而对于调用门由于其只能出现在GDT和LDT中,因此与我们这里讨论的中断和异常无关。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:669876次
    • 积分:12468
    • 等级:
    • 排名:第1170名
    • 原创:288篇
    • 转载:1964篇
    • 译文:3篇
    • 评论:10条
    最新评论