Linux内核中的硬件中断堆栈上半部分?

我知道Linux内核在2.6.32之前把线程内核栈作为ISR栈,在2.6.32之后,内核使用分离栈,如果错了请纠正我。 你会告诉我什么时候ISR堆栈被设置/设置,或者如果有的话就销毁。 或者告诉我源文件名和行号? 提前致谢。

2014年10月17日更新:

Linux中有几种堆栈。 下面是我知道的3个主要(不是全部)。

  1. 用户空间进程栈,每个用户空间任务都有自己的栈,这是在任务创build时由mmap()创build的。
  2. 内核栈为用户空间任务,每个用户空间任务一个,在do_fork() – > copy_process() – > dup_task_struct() – > alloc_thread_info()内创build并用于system_call。
  3. 在arch / x86 / kernel / irq_32.c中定义的每个CPU(2.6之后)的硬件中断堆栈(上半部分): DEFINE_PER_CPU(struct irq_stack *, hardirq_stack); do_IRQ() – > handle_irq() – > execute_on_irq_stack()切换中断堆栈

请让我知道这些是否正确。

中断处理程序有IRQ堆栈。 中断处理程序的2种堆栈进入画面:

  1. 硬件IRQ堆栈。
  2. 软件IRQ堆栈。

与每个进程分配的常规内核堆栈相反,两个附加堆栈是按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;