八篇关于保护模式的文章,今天总算告一段落了。 言归正传。
今天我们学习陷阱门,先来看看理论部分。
1。异常来源:
1)处理器检测到程序错误产生异常。
   在程序运行期间,检测到程序错误。被进一步分为:faluts(故障),traps(陷阱),aborts.(中止)
2)软件产生异常, int0 ,int 3, BOUND等指令在软件中产生异常。
3)机器检测异常,由处理器检查内部芯片和外部总线产生的异常。

windows通过中断门,任务门或者陷阱门进行中断或者异常处理,前面我们学习过中断门和任务门,今天我们一起看看陷阱门的结构。

陷阱门适宜于处理异常,在有出错码的情况下,转入处理程序之前还要把出错码压入堆栈。只有异常处理才可能有出错码。

a,b是没有特权变化时的情况, c,d是有特权变化的情况。
2.异常处理的步骤
由硬件自动实现的异常处理的步骤如下: 
    1).判断中断向量号要索引的门描述符是否超出IDT的界限。若超出界限,就引起通用保护故障,出错码为中断向量号乘8再加2。 

    2). 从IDT中取得对应的门描述符,分解出选择子、偏移量和描述符属性类型,并进行有关检查。描述符只能是任务门、286中断门、286陷阱门、386 中断门或386陷阱门,否则就引起通用保护故障,出错码是中断向量号乘8再加2。

    3).如果是由INT n指令或INTO指令引起转移,还要检查中断门、陷阱门或任务门描述符中的DPL是否满足CPL<=DPL(对于其它的异常或中断,门中的DPL被忽略)。这种检查可以避免应用程序执行INT n指令时,使用分配给各种设备用的中断向量号。如果检查不通过,就引起通用保护故障,出错码是中断向量号乘8再加2。
    4).门描述符中的P位必须是1,表示门描 述符是一个有效项,否则就引起段不存在故障,出错码是中断向量号乘8再加2。
    5). 根据门描述符类型,分情况转入中断或异常处理程序。对于异常处理,在开始上述步骤之前,还要根据异常类型确定返回点;如果有出错代码,则形成符合出 错码格式的出错码,并在实际执行异常处理程序之前把出错码压入堆栈。

3.通过陷阱门的转移
如果中断向量号所指示的门描述符是386陷阱门,那么控制转移到当前任务的一个处理程序过程,并且可以变换特权级。与其它调用门的 CALL指令一样,从陷阱门中获取指向处理程序的48位全指针。其中16位选择子是对应处理程序或代码段的选择子,它指示全局描述符表GDT或局 部描述符表LDT中的代码段描述符;32位偏移指示处理程序入口点在代码段内的偏移量。通过陷阱门的转移过程如下所示,该过程由硬件自动进行。
  (1)若选择子为空,则产生通用保护故障;
  (2)取对应的描述符;
  (3)若非存储段描述符,则产生通用保护故障;
  (4)若非一致代码段且DPL且段存在, 则切换到内层堆栈;
  (5)调整RPL=0;
  (6)把描述符装入CS;
  (7)若入口偏移越界,则产生通用保护故障;
  (8)EFLAGS压入堆栈;
  (9)CS 压入堆栈;
  (10)EIP压入堆栈;
  (11)使TF=0,NT=0;
  (12)若有出错码,则把出错码压入堆栈;
  (13)转入处理程序。

 
4.异常处理后的返回
 
指令IRET用于从异常处理程序的返回。该指令的执行根据任务嵌套标志NT位是否为1分为两种情形。
NT位为1,表示是嵌套任务的返回。当前TSS中的链接字段保存有前一任务的TSS的选择子,取出该选择子进行任务切换就完成了返回。这种情形在由通过任务门转入的异常处理程序返回时出现,因为在由中断门或陷阱门转入处理程序时,NT位已被清0。
NT位为0,表示当前任务内的返回。这种情形在由通过中断门或陷阱门转入的中断或异常处理程序返回时出现。具体进行的操作包括:从堆栈顶弹出返回指 针EIP及CS,然后弹出EFLAGS值。弹出的CS选择子的RPL字段,确定返回后的特权级。如果返回选择子的RPL与CPL相同,则不进行特权级改 变。若RPL规定了一个外层特权级,则需要特权级改变,从内层堆栈中弹出外层堆栈的指针ESP及SS的值。这些做法与RET指令相似。例如,使用CS选择 子的RPL,而不是由选择子标识的段的DPL,是为了返回到不在DPL给定特权级的一致代码段。若弹出的CS的选择子的RPL规定了一个内层特权级,则产 生通用保护故障。需要注意的是,对于IRET指令,保存在当前堆栈中的返回地址中的选择子字段必须指向代码段描述符。而不能是系统段或门描述符。否则将引 起通用保护故障。
对于提供出错代码的异常处理程序,必须先人为地从堆栈中弹出出错代码,然后再执行IRET指令,及出错代码不会自动被处理器弹出或取消。
中断返回指令IRET不仅能够用于由中断/异常引起的嵌套任务的返回,而且也适用于由段间调用指令CALL通过任务门引起的嵌套任务的返回,如前文所述,在执行通过任务门进行任务切换的段间调用指令CALL时,标志寄存器中的NT位被置为1,表示任务嵌套。而RET指令不能实现此功能。

上传的附件 src.rar
exe.rar