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 中的进程栈、线程栈、内核栈、中断栈](http://img.jiangsulong.com/220421/044954NA-8.jpg)
文章插图
而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘 。
推荐阅读
- 名人对《水浒传》的宋江评价 水浒传中的宋江
- |职场中的这三把金钥匙:效果如何,关键看你怎么用!
- Winform界面开发中的困境及解决方案
- Manjaro 和 Arch Linux 有何不同,哪个更好?
- 黑客大神浅谈LDAP注入攻击
- 浅谈消炎药饭前还是饭后吃
- 在田忌赛马的故事中田忌共有几种可采用的应对策略 田忌赛马中的孙膑是个怎样的人
- 蒲公英药用价值有什么
- 用这几个工具,Windows下写代码比Linux还顺手
- 鸡兔同笼子问题看算法在编程中的重要性,终于明白为何工资低了