Linux内核中的硬件中断堆栈是什么?

时间:2014-10-03 11:40:38

标签: linux stack kernel interruption

我知道Linux内核在2.6.32之前将线程内核堆栈作为ISR堆栈,在2.6.32之后,内核使用分离堆栈,如果错误,请更正我。 你能告诉我何时设置/装箱ISR堆栈,或者如果存在则销毁。或者告诉我源文件名和行号?提前谢谢。

于2014年10月17日更新:

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

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

1 个答案:

答案 0 :(得分:2)

对于中断处理程序,有IRQ堆栈。中断处理程序有两种堆栈进入图片:

  1. 硬件IRQ堆栈。
  2. 软件IRQ Stack。
  3. 与每个进程分配的常规内核堆栈相比,每个CPU分配两个额外的堆栈。每当发生硬件中断(或处理softIRQ)时,内核都需要切换到适当的堆栈。从历史上看,中断处理程序没有收到自己的堆栈。相反,中断处理程序将共享正在运行的进程的堆栈,它们被中断。内核堆栈大小为两页;通常,在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;