长模式64bit中断

amd64 Jul 01, 2020

约定

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

ring3发生中断

CPU中断工作

  1. 对齐栈, CPU对RSP寄存器and一个&0xfffffffffffffff0
  2. 如果使用了ist, 切换中断栈,
  3. 如果特权级切换, 目标特权级的DPL用来作tss内rsp的索引,选择对应的内核栈切换进去.这里指的应该是ring3 到ring0的切换。
  4. 如果没有ring3到ring0的特权级切换,CPU不会用TSS的栈,而是在当前的内核栈位置直接进行中断操作。
  5. 如果发生特权级切换 SS会被清0
  6. 在新栈中 push ss, rsp, rflags(清除TF NT RF位), 如果是中断门,清除if
  7. 继续 push cs, rip
  8. 如果该中断有error_code, push error_code
  9. 切换cs, 跳转执行handler
Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.