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

Sun*_*lly 5 linux stack linux-kernel interrupt-handling top-halves

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

  1. 用户模式进程正在CPU上执行
  2. 内核模式进程正在CPU上执行

想了解上述两种情况下中断处理程序使用哪个堆栈,为什么?

ska*_*hal 8

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

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

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

  • 这在某种程度上有所回应.我实际上看的是当前执行任务是用户/内核时会发生什么.但是我自己找到了答案.如果中断将在用户级别执行,则TSS堆栈切换发生在其相应的内核堆栈中,如果它在与内核相同的权限级别执行,则使用中断的内核堆栈. (2认同)