该博客不错,有不少有用的信息
中断程序的一开始我们执行一个PUSHALL,把这些积存器保存在核心栈中,中断结束返回前我们执行一个POPALL将保存在栈中的值弹出到各寄存器。
中断发生时会进行一个栈的切换,会将esp置成tss->esp0,在2.4内核中就是task struct中的thread->esp0,也就是我们所说的核心栈。
中断完成后返回时也会进行一个栈切换,将esp置成tss->esp,这个是用户栈。
以上两个切换都是由硬件完成的。