关于中断的特权级转换此图选自《linux内核完全注释》

由上图可以看出,当特权级没有转换时,中断处理程序和被中断进程是同用一个堆栈,但是当发生了堆栈切换,例如一般中断进程都处于0特权级下,当3的特权级进程运行时,中断发生,那么处理器就要到TSS处找到0级的ss和esp,然后切换堆栈,然后处理器把被中断进程的ss,esp,EFLAGS,CS,EIP,压栈,如果有错误码的话,错误码将最后被压栈(iretd指令并不会自动弹出错误码。。。)

这里要特别注意的是,由指令产生的中断(int)是要进行特权级检查的,这意味着只有进程的CPL<=门的DPL才能访问中断门,所以上述的从3特权级跳到0级的中断门只能是在硬件引发中断的情况下才会发生,因为处理器是不会对硬件引发的中断进行特权级检查(此处可以参考《linux内核完全注释》)

相关文章: