我知道Linux内核在2.6.32之前把线程内核栈作为ISR栈,在2.6.32之后,内核使用分离栈,如果错了请纠正我。 你会告诉我什么时候ISR堆栈被设置/设置,或者如果有的话就销毁。 或者告诉我源文件名和行号? 提前致谢。
2014年10月17日更新:
Linux中有几种堆栈。 下面是我知道的3个主要(不是全部)。
DEFINE_PER_CPU(struct irq_stack *, hardirq_stack);
do_IRQ() – > handle_irq() – > execute_on_irq_stack()切换中断堆栈 请让我知道这些是否正确。
中断处理程序有IRQ堆栈。 中断处理程序的2种堆栈进入画面:
与每个进程分配的常规内核堆栈相反,两个附加堆栈是按CPU分配的。 无论何时发生硬件中断(或者处理软IRQ),内核都需要切换到相应的堆栈。 历史上,中断处理程序没有收到自己的堆栈。 相反,中断处理程序将共享运行进程的堆栈,它们中断。 内核堆栈有两页大小, 通常,在32位体系结构上是8KB,而在64位体系结构上是16KB。 因为在这个设置中,中断处理程序共享堆栈,所以它们必须非常节约地分配在那里的数据。 当然,内核栈仅限于开始,所以所有的内核代码都要谨慎。
以下数组提供了指向其他堆栈的指针:arch / x86 / kernel / irq_32.c
static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;