local_irq_save和 local_irq_disable
来源:互联网 发布:淘宝助手怎么上架宝贝 编辑:程序博客网 时间:2024/05/16 03:07
如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理,这两个函数定义在 <asm/system.h>中:
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
local_irq_save的调用把当前中断状态保存到flags中,然后禁用当前处理器上的中断发送。注意, flags 被直接传递, 而不是通过指针来传递。
local_irq_disable不保存状态而关闭本地处理器上的中断发送; 只有我们知道中断并未在其他地方被禁用的情况下,才能使用这个版本。
可通过如下函数打开中断:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
第一个版本将local_irq_save保存的flags状态值恢复, 而local_irq_enable则无条件打开中断。与 disable_irq不同, local_irq_disable不会维护对多次的调用的跟踪。 如果调用链中有多个函数需要禁止中断, 应该使用local_irq_save.
在2.6内核, 没有方法全局禁用整个系统的所有中断。 内核开发者认为关闭所有中断的代价太高,因此没有必要提供这个能力。如果读者使用的老驱动程序调用了类似cli和sti这样的函数,为了该驱动程序能够在2.6下使用,则需要进行修改而使用正确的锁。
in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,
函数实现:
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。
http://wmzjzwlzs.blog.163.com/blog/static/205014196201310174725996/
- local_irq_save和 local_irq_disable
- local_irq_save与local_irq_disable
- local_irq_save
- local_irq_disable
- local_irq_disable
- local_irq_disable
- local_irq_disable
- local_irq_disable和disable_irq的区别
- local_irq_save 与 local_irq_restore
- local_irq_enable和local_irq_disable是消除异步并发源的有效方式
- start_kernel——local_irq_disable
- local_irq_disable与local_irq_enable
- local_bh_disable, preempt_disable, local_irq_disable
- local_irq_disable,irq_disable与disable_irq的区别
- 互斥与同步——local_irq_enable与local_irq_disable
- 互斥与同步——local_irq_enable与local_irq_disable
- . 和 ->
- || 和&&
- struts1工作原理
- Linux网络虚拟化与MLPPP多链路
- android MSM8974 上DeviceTree简介
- 记录——《C Primer Plus (第五版)》第七章编程练习第八题
- html5定位
- local_irq_save和 local_irq_disable
- SQL中的case when then else end用法
- java反射机制的理解
- Android杂谈-RelativeLayout中的baseline是什么
- 数制知识小结
- SQL Server分页存储过程的五种方法及性能比较
- Android Provider获取通信录
- NSFetchedResultsController Assertion failure in -[UITableView _endCellAnimationsWithContext:]
- 针对全部浏览器对HTML5新元素添加样式