内核中的原子上下文
来源:互联网 发布:java 多重继承 编辑:程序博客网 时间:2024/05/16 14:24
内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。(但是可以中断吧?)一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供了四个宏来判断是否处于这几种情况里:
8-15位表示软中断计数,通常由local_bh_disable/local_bh_enable修改,同时表明内核容许的最大软中断深度是256。
位16-27是硬中断计数,通常由enter_irq/exit_irq修改,同时表明内核容许的最大硬中断深度是4096。
第28位是PREEMPT_ACTIVE标志。用代码表示就是:
PREEMPT_MASK: 0x000000ff
SOFTIRQ_MASK: 0x0000ff00
HARDIRQ_MASK: 0x0fff0000
凡是上面4个宏返回1得到地方都是原子上下文,是不容许内核访问用户空间,不容许内核睡眠的,不容许调用任何可能引起睡眠的函数。而且代表thread_info->preempt_count不是0,这就告诉内核,在这里面抢占被禁用。
但是,对于in_atomic()来说,在启用抢占的情况下,它工作的很好,可以告诉内核目前是否持有自旋锁,是否禁用抢占等。但是,在没有启用抢占的情况下,spin_lock根本不修改preempt_count,所以即使内核调用了spin_lock,持有了自旋锁,in_atomic()仍然会返回0,错误的告诉内核目前在非原子上下文中。所以凡是依赖in_atomic()来判断是否在原子上下文的代码,在禁抢占的情况下都是有问题的。
#define in_irq() (hardirq_count()) //在处理硬中断中#define in_softirq() (softirq_count()) //在处理软中断中#define in_interrupt() (irq_count()) //在处理硬中断或软中断中#define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) //包含以上所有情况这四个宏所访问的count都是thread_info->preempt_count。这个变量其实是一个位掩码。最低8位表示抢占计数,通常由spin_lock/spin_unlock修改,或程序员强制修改,同时表明内核容许的最大抢占深度是256。
8-15位表示软中断计数,通常由local_bh_disable/local_bh_enable修改,同时表明内核容许的最大软中断深度是256。
位16-27是硬中断计数,通常由enter_irq/exit_irq修改,同时表明内核容许的最大硬中断深度是4096。
第28位是PREEMPT_ACTIVE标志。用代码表示就是:
PREEMPT_MASK: 0x000000ff
SOFTIRQ_MASK: 0x0000ff00
HARDIRQ_MASK: 0x0fff0000
凡是上面4个宏返回1得到地方都是原子上下文,是不容许内核访问用户空间,不容许内核睡眠的,不容许调用任何可能引起睡眠的函数。而且代表thread_info->preempt_count不是0,这就告诉内核,在这里面抢占被禁用。
但是,对于in_atomic()来说,在启用抢占的情况下,它工作的很好,可以告诉内核目前是否持有自旋锁,是否禁用抢占等。但是,在没有启用抢占的情况下,spin_lock根本不修改preempt_count,所以即使内核调用了spin_lock,持有了自旋锁,in_atomic()仍然会返回0,错误的告诉内核目前在非原子上下文中。所以凡是依赖in_atomic()来判断是否在原子上下文的代码,在禁抢占的情况下都是有问题的。
原文地址:点击打开链接
原子操作 和 原子上下文 的概念好像不大一样。
- 内核中的原子上下文
- 内核中的原子上下文
- 内核中的原子上下文
- 内核中的原子上下文
- 内核中的原子上下文
- Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解
- 原子上下文
- 原子上下文
- linux内核中的原子操作
- Linux内核中的上下文切换
- Linux内核中的的原子变量分析
- Linux内核中的原子操作的实现
- 进程上下文、中断上下文及原子上下文
- 进程上下文、中断上下文及原子上下文
- Linux内核中的进程上下文和中断上下文
- 上下文切换与原子操作
- 进程上下文和中断上下文、原子上下文的区别
- 进程上下文和中断上下文、原子上下文的区别
- Qt 导出图像(代码保存)
- Linux 网卡设置命令
- linux wifi的配置和使用命令
- Spring中JSP不能加载CSS的解决方法
- .net中 验证用户名 2~20个字符,支持中文、英文、数字、“_”、“-”的正则表达式
- 内核中的原子上下文
- Windows API GetModuleFileName代码原型
- atoi C++ 实现
- java实现队列(数组方式)
- 二分查找
- Android学习笔记之mainfest文件中android属性
- hdu 4548
- 苹果“APP复活”,用户爽了,开发人员懵了
- VS版本