local_irq_disable
local_irq_disable僅僅是設置當前CPU的中斷屏蔽位
disable_irq 是禁用全部cpu中斷(只是當前irq)
如果你要禁止所有的中斷該怎么辦? 在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()。
總結
以上是生活随笔為你收集整理的local_irq_disable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux I2C子系统分析之(一) -
- 下一篇: 关于中断处理程序中的关中断函数disab