Linux 关中断 与 开中断
来源:互联网 发布:马萨达精神 知乎 编辑:程序博客网 时间:2024/04/28 01:29
Linux 关中断 与 开中断
如果你要禁止所有的中断该怎么办? 在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()。
- Linux 关中断 与 开中断
- Linux 关中断 与 开中断
- Linux 关中断 与 开中断
- 禁止所有的中断(关中断/开中断)
- 禁止所有的中断(关中断/开中断)
- linux中断--LINUX中断机制与信号
- 关中断,睡眠
- linux 中断与时钟
- MSI中断与Linux
- linux 中断与时钟
- linux 中断与信号
- linux中断与定时器
- 现代体系结构(指令流水),中断处理(中断隐指令,中断门,Do_IRQ,关中断,Do_IRQ_Handler, 软中断SWI,中断嵌套与屏蔽),语句同步处理
- 什么叫中断?什么叫中断处理?什么叫中断响应?什么叫关中断?什么叫开中断?什么叫中断屏蔽?
- 【中断】:LINUX中断
- 中断 与 中断 或
- 中断与中断系统
- Linux中断定义与初始化
- 关于rand和srand函数使用的一点心得
- 如何抽取文件夹下的多个数据库文件【eg.SQLite】
- jquery禁用select和取消禁用
- Unity3d场景中出现闪面的解决方法
- iOS UI编程细节 .
- Linux 关中断 与 开中断
- Java学些笔记41:FTP4j
- ajax中的get与post的编码
- IOS上AudioSession设置, 切换扬声器和听筒详解 .
- SVN搭建SVN服务器管理
- json_decode转换时整形数字溢出问题学习
- 在 libvirt 上使用 LVM 存储设备
- iOS开发之按钮或图片框圆角处理
- Hadoop生态图谱 与 七年历程