Linux Stack Sizes

The reason that documentation is scarce is that it’s an area that’s quite architecture-dependent. The code is really the best documentation – for example, the THREAD_SIZE macro defines the (architecture-dependent) per-thread kernel stack size.

The stacks are allocated in alloc_thread_stack_node(). The stack pointer in the struct task_struct is updated in dup_task_struct(), which is called as part of cloning a thread.

The kernel does check for kernel stack overflows, by placing a canary value STACK_END_MAGIC at the end of the stack. In the page fault handler, if a fault in kernel space occurs this canary is checked – see for example the x86 fault handler which prints the message Thread overran stack, or stack corrupted after the Oops message if the stack canary has been clobbered.

Of course this won’t trigger on all stack overruns, only the ones that clobber the stack canary. However, you should always be able to tell from the Oops output if you’ve suffered a stack overrun – that’s the case if the stack pointer is below task->stack.

Leave a Comment