x86_64架构硬件中断所用栈及中断栈切换机制相关问询
问题1解答
你提到的硬件自动保存上下文用的interrupt stack,绝大多数场景下就是Linux内核每CPU专属的hardirq_stack,只有NMI、双异常(double fault)等特殊中断会使用x86_64架构提供的IST(中断栈表)中单独配置的专用栈,不走通用hardirq_stack。
关于softirq共用栈的一致性保证逻辑:
- 常规场景下
softirq是在硬中断处理完成、返回上下文之前执行的,此时本身就运行在当前CPU的hardirq_stack上。如果此时触发新的硬件中断,CPU会直接在当前hardirq_stack上按栈结构向下压入新的中断上下文,遵循后进先出的嵌套规则,嵌套中断全部处理完成后逐层弹栈,不会出现栈数据混乱。 - 当
softirq积压过多时,内核会唤醒ksoftirqd内核线程处理剩余softirq,此时softirq运行在ksoftirqd的进程栈上,这种情况下触发硬件中断,CPU会自动从进程栈切换到hardirq_stack处理中断,处理完成后再切回原进程栈,完全不会互相干扰。
问题2解答
x86_64架构下硬件触发中断时,只会自动把SS、RSP、RFLAGS、CS、RIP以及部分中断带有的错误码压入栈中,其余通用寄存器、段寄存器等上下文的保存是由内核中断入口的汇编代码实现的:
- Linux内核在
entry_64.S的中断入口逻辑中,会按pt_regs结构体的固定格式,把所有通用寄存器、段寄存器依次手动压入栈中,后续的C语言中断处理函数可以直接通过pt_regs结构体访问所有寄存器状态。 - 中断处理完成返回中断前上下文时,汇编代码会先把手动压入的寄存器依次弹出恢复,最后执行
iret指令弹出硬件自动保存的上下文,完成整个寄存器状态的恢复。
内容的提问来源于stack exchange,提问作者byWind
相关产品推荐
相关产品推荐

