汇编学习笔记(18) - 中断与异常
基本概念
80386将8086中的中断分成了两个
中断
由外部硬件引起的中断仍然较中断
异常
有内部中断引起的中断改叫异常,因为为他一般与代码的运行有关,而中断一般与代码的运行无直接关系
然后根据 恢复点,即异常处理完之后从哪里介质运行又细分为3类
故障
在指令运行前或运行中出异常,处理完异常后会重新执行指令,比如缺页异常
陷阱
在指令运行完之后出异常,异常处理完后从吓一跳开始处理,比如INT软中断
终止
处理完之后会返回,有处理程序自己决定怎么办,一般是很严重的错误,比如处理异常的时候出异常了
虽然对中断做了细分,但是处理方式还是和8086差不多,只不过中断表被保存在了IDT寄存器中
IDT寄存器中只能有中断门,陷阱门,任务门,注意这里的陷阱门与 中断分类的陷阱门没直接区别,所以当中断发生的时候根据中断号,在IDT表中找到对应的处理程序。
这里没有强制的对应关系,也就是说无论何种中断或异常,他的处理程序都可以是 中断门,陷阱门,任务门 中的异常
权限要求
如果是有CPU主动触发的中断或异常,他是不比较CPL和门的DPL的
如果是INT指令触发的,则需要比较CPL和门的DPL要求是 CPL<= DPL
中断门和陷阱门
中断门和陷阱门的处理方式和用CALL调用任务门是一样的,当门指向的是非一致代码段,并且CPL> DPL的时候会设CPL = DPL,返回用IRET,同样IRET和RET的处理方式也是一模一样,所以这里甚至可以用RET代替IRET
注意中断门和陷阱门市当前任务下进行的,所以环境的保护需要自己处理
中断门和陷阱门的唯一区别就是是否自动启动中断屏蔽即标志位IF的置位区别
任务门
和直接用CALL 调用门也没啥区别,唯一的区别就是这里会将中断信息压栈到新任务的堆栈上,处理完也是用IRET返回,IRET可以通过标志寄存器的TN位知道这次是任务门调用还是中断门和陷阱门的调用,然后根据情况选择是代码转跳还是任务切换。好像RET也行?
注意点: 中断和陷阱门在原任务环境下运行,所以要注意环境的保护,而任务门则切换的任务环境起到了隔离的的作用相对安全,各有利弊