一.硬件处理
我们在每条指令完成的时候,控制单元就会检查是否发生了中断。若不发生:继续执行下一条指令;若发生:进行下面的硬件处理:
1.确定中断的向量i。
2.读IDT中的第i项得到向量i的中断描述符。
3.中断描述符结合GDT得到得到中断处理程序的段描述符。
4.进程的CPL与段描述符的DPL比较,若CPL优先级比DPL的优先级高,说明中断的优先级比进程优先级低,产生异常。进程的CPL与中断描述符的DPL比较,若CPL优先级
比DPL的优先级低,说明这个门不是用户进程可以访问的,也产生异常,正常则执行下面步骤。
5.检查CPL是否发生变化(这个其实就是是否是从用户态进入内核态),如果变化,则要切换栈。这个很容易弄清,因为,用户态和内核态用的栈是不一样的。
6.如果发生的是故障,故障要重新执行导致异常的那条指令。所以用那条指令的地址装载cs和eip来执行那条指令。
7.将eflags、cs、和eip的值圧栈