11
votes

In a multitasking system when any hardware generates a interrupt to a particular CPU, where CPU can be performing either of below cases unless it is already serving a ISR:

  1. User mode process is executing on CPU
  2. Kernel mode process is executing on CPU

Would like to know which stack is used by interrupt handler in above two situations and why ?

3
Looking on Wikipedia would have been faster than asking here.Basile Starynkevitch

3 Answers

13
votes

All interrupts are handled by kernel. That is done by interrupt handler written for that particular interrupt. For Interrupt handler there is IRQ stack. The setup of an interrupt handler’s stacks is configuration option. The size of the kernel stack might not always be enough for the kernel work and the space required by IRQ processing routines. Hence 2 stack comes into picture.

  1. Hardware IRQ Stack.
  2. Software IRQ Stack.

In contrast to the regular kernel stack that is allocated per process, the two additional stacks are allocated per CPU. Whenever a hardware interrupt occurs (or a softIRQ is processed), the kernel needs to switch to the appropriate stack. Historically, interrupt handlers did not receive their own stacks. Instead, interrupt handlers would share the stack of the running process, they interrupted. The kernel stack is two pages in size; typically, that is 8KB on 32-bit architectures and 16KB on 64-bit architectures. Because in this setup interrupt handlers share the stack, they must be exceptionally frugal with what data they allocate there. Of course, the kernel stack is limited to begin with, so all kernel code should be cautious.

2
votes

Interrupts are only handled by the kernel. So it is some kernel stack which is used (in both cases).

Interrupts do not affect (directly) user processes.

Processes may get signals, but these are not interrupts. See signal(7)...

0
votes

Historically, interrupt handlers did not receive their own stacks. Instead, they would share the stack of the process that they interrupted. Note that a process is always running. When nothing else is schedulable, the idle task runs.

The kernel stack is two pages in size:

8KB on 32-bit architectures.

16KB on 64-bit architectures.

Because of sharing the stack, interrupt handlers must be exceptionally frugal with what data they allocate there.

Early in the 2.6 kernel process, an option was added to reduce the stack size from two pages to one, providing only a 4KB stack on 32-bit system, and interrupt handlers were given their own stack, one stack per processor, one page in size. This stack is referred to as the interrupt stack.

Although the total size of the interrupt stack is half that of the original shared stack, the average stack space available is greater because interrupt handlers get the full page of memory to themselves, because previously every process on the system needed two pages of contiguous, nonswappable kernel memory. Your interrupt handler should not care what stack setup is in use or what the size of the kernel stack is. Always use an absolute minimum amount of stack space

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