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

问题描述:

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

更新时间2014年10月17日:

有几种类型的Linux软件栈的。下面是我知道的3个主要(不是全部)。

  1. 用户空间处理堆栈,每个用户空间任务都有自己的堆栈, 这通过创建MMAP()被创建任务时。
  2. 用于用户空间任务的内核堆栈,用于每个用户空间任务,这是在do_fork() - > copy_process() - > dup_task_struct() - > alloc_thread_info()中创建并用于system_call的 。
  3. 栈硬件中断(上半部分),一个用于每个CPU(2.6)之后,在 拱/ 86 /内核/ irq_32.c定义: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。因为在这个设置中,中断处理程序共享堆栈,所以它们必须非常节约地分配它们分配的数据。当然,内核栈仅限于开始,因此所有内核代码都应该谨慎。下面阵列中提供

指针到附加堆栈: 拱/ 86 /内核/ irq_32.c

static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; 
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;