3

我知道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 回答 1

2

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

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

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