x86 - 64 架构中的中断处理和堆栈切换

主要观点:本文旨在解释 x86 - 64 架构中的中断处理和堆栈切换,作者因在相关课程中不理解中断过程调用和堆栈切换而撰写此文,借助 Xeno 的幻灯片和英特尔手册进行简化解释,并提供了相关实验代码和截图。
关键信息

  • 中断发生时,系统硬件会查阅中断描述符表寄存器(IDTR)以定位中断描述符表(IDT),LIDT 指令用于加载 IDTR。
  • IDT 中的描述符可为中断门或陷阱门,包含段选择器和 64 位偏移量,指示异常或中断处理程序代码的位置。
  • 存在特权级保护规则,如当前特权级(CPL)与中断门描述符特权级(DPL)的比较等。
  • 可通过 WinDBG 等工具查看 CS 寄存器等相关信息,如r cs命令查看 CS 寄存器值,!ms_gdt命令查看 GDT。
  • 堆栈切换机制在处理器切换到不同特权级时起作用,涉及任务状态段(TSS),TSS 通过任务寄存器(TR)访问。
  • 通过实验在内核空间和用户空间测试了特权级保护规则。
    重要细节
  • 异常或中断向量可作为索引访问 IDT 中的特定描述符,Intel 手册 3A 卷 6 - 2 节可找到这些向量。
  • 特权级保护规则中,软件中断和硬件中断在 CPL 与 DPL 关系上有不同规定,特殊条件下处理程序执行也有相应规则。
  • 堆栈切换时,从 TSS 获取用于处理程序的堆栈段选择器和堆栈指针等信息,IRET 指令用于返回处理程序。
  • 中断门描述符的中断堆栈表(IST)位可指定特定索引用于堆栈切换。
  • 实验中在内核空间通过 WinDBG 等操作设置断点、调整 DPL 等并观察输出,在用户空间编写函数触发特定中断并观察结果。
阅读 15
0 条评论