浅谈Linux 中的进程栈、线程栈、内核栈、中断栈( 四 )


register unsigned long current_stack_pointer asm ("sp");static inline struct thread_info *current_thread_info(void){return (struct thread_info *)(current_stack_pointer & ~(THREAD_SIZE - 1));}#define get_current() (current_thread_info()->task)#define current get_current()四、中断栈
进程陷入内核态的时候,需要内核栈来支持内核函数调用 。中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用 。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的 。但是具体是否共享,这和具体处理架构密切相关 。
X86 上中断栈就是独立于内核栈的;独立的中断栈所在内存空间的分配发生在 arch/x86/kernel/irq_32.c 的 irq_ctx_init()函数中(如果是多处理器系统,那么每个处理器都会有一个独立的中断栈),函数使用 __alloc_pages 在低端内存区分配 2个物理页面,也就是8KB大小的空间 。有趣的是,这个函数还会为 softirq 分配一个同样大小的独立堆栈 。如此说来,softirq 将不会在 hardirq 的中断栈上执行,而是在自己的上下文中执行 。

浅谈Linux 中的进程栈、线程栈、内核栈、中断栈

文章插图
 
而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘 。


推荐阅读