长模式64bit中断
约定
- 所有代码段为64位
- 中断栈是16字节对齐的
- ss和rsp会被无条件地push, 无论有没有cpl变更,统统push, 64bit模式不使用ss,这里只是为了iret可以返回兼容模式.
- iret指令会无条件pop掉rsp


CPU中断工作
- 对齐栈, CPU对RSP寄存器and一个&0xfffffffffffffff0
- 如果使用了ist, 切换中断栈,
- 如果特权级切换, 目标特权级的DPL用来作tss内rsp的索引,选择对应的内核栈切换进去.这里指的应该是ring3 到ring0的切换。
- 如果没有ring3到ring0的特权级切换,CPU不会用TSS的栈,而是在当前的内核栈位置直接进行中断操作。
- 如果发生特权级切换 SS会被清0
- 在新栈中 push ss, rsp, rflags(清除TF NT RF位), 如果是中断门,清除if
- 继续 push cs, rip
- 如果该中断有error_code, push error_code
- 切换cs, 跳转执行handler