中断处理程序使用哪个堆栈 - Linux

时间:2015-02-27 06:54:33

标签: linux linux-kernel stack interrupt-handling top-halves

在多任务系统中,当任何硬件产生对特定CPU的中断时,CPU可以执行以下任一情况,除非它已经在为ISR提供服务:

  1. 用户模式进程正在CPU上执行
  2. 内核模式进程正在CPU上执行
  3. 想知道上述两种情况下中断处理程序使用哪个堆栈以及为什么?

3 个答案:

答案 0 :(得分:8)

所有中断都由内核处理。这是通过为该特定中断编写的中断处理程序完成的。对于中断处理程序,有IRQ堆栈。中断处理程序堆栈的设置是配置选项。对于内核工作和所需的空间,内核堆栈的大小可能并不总是足够的 IRQ处理例程。因此,2堆栈进入图片。

  1. 硬件IRQ堆栈。
  2. 软件IRQ Stack。
  3. 与每个进程分配的常规内核堆栈相比,每个CPU分配两个额外的堆栈。每当发生硬件中断(或处理softIRQ)时,内核都需要切换到  适当的堆栈。 从历史上看,中断处理程序没有收到自己的堆栈。相反,中断处理程序将共享正在运行的进程的堆栈,它们被中断。内核堆栈大小为两页;通常,在32位体系结构上为8KB,在64位体系结构上为16KB。因为在这个设置中,中断处理程序共享堆栈,所以它们必须非常节俭地分配它们分配的数据。当然,内核堆栈仅限于开始,因此所有内核代码都应该谨慎。

答案 1 :(得分:2)

Interrupts仅由内核处理。所以它是一些内核堆栈(在两种情况下都使用)。

中断不会(直接)影响用户processes

进程可能会获得signals,但这些不是中断。见signal(7) ...

答案 2 :(得分:0)

从历史上看,中断处理程序没有接收到自己的堆栈。 相反,他们将共享被中断的进程堆栈。 请注意,进程始终在运行。如果没有其他可安排的时间,则空闲任务将运行。

内核堆栈的大小为两页:

在32位体系结构上为8KB。

在64位体系结构上为16KB。

由于共享堆栈,因此中断处理程序在分配给它们的数据方面必须格外节约。

在2.6内核进程的早期,添加了一个选项以将堆栈大小从两页减少到一个,在32位系统上仅提供4KB堆栈,并且为中断处理程序分配了自己的堆栈,每个处理器一个堆栈,一页大小。该堆栈称为中断堆栈。

尽管中断堆栈的总大小是原始共享堆栈的一半,但平均堆栈空间却更大,这是因为中断处理程序可以自己获得完整的内存页,因为以前系统上的每个进程都需要两页的内存。连续的,不可交换的内核内存。 您的中断处理程序不应该在乎使用什么堆栈设置或内核堆栈的大小。始终使用绝对最小的堆栈空间

https://notes.shichao.io/lkd/ch7/#stacks-of-an-interrupt-handler