local_irq_disable
local_irq_disable僅僅是設(shè)置當(dāng)前CPU的中斷屏蔽位
disable_irq 是禁用全部cpu中斷(只是當(dāng)前irq)
如果你要禁止所有的中斷該怎么辦? 在2.6內(nèi)核中,可以通過(guò)下面兩個(gè)函數(shù)中的其中任何一個(gè)關(guān)閉當(dāng)前處理器上的所有中斷處理,這兩個(gè)函數(shù)定義在 <asm/system.h>中:
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
對(duì) local_irq_save的調(diào)用將把當(dāng)前中斷狀態(tài)保存到flags中,然后禁用當(dāng)前處理器上的中斷發(fā)送。注意, flags 被直接傳遞, 而不是通過(guò)指針來(lái)傳遞。 local_irq_disable不保存狀態(tài)而關(guān)閉本地處理器上的中斷發(fā)送; 只有我們知道中斷并未在其他地方被禁用的情況下,才能使用這個(gè)版本。
可通過(guò)如下函數(shù)打開(kāi)中斷:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
第一個(gè)版本將local_irq_save保存的flags狀態(tài)值恢復(fù), 而local_irq_enable無(wú)條件打開(kāi)中斷. 與 disable_irq不同, local_irq_disable不會(huì)維護(hù)對(duì)多次的調(diào)用的跟蹤。 如果調(diào)用鏈中有多個(gè)函數(shù)需要禁止中斷, 應(yīng)該使用local_irq_save.
在2.6內(nèi)核, 沒(méi)有方法全局禁用整個(gè)系統(tǒng)的所有中斷。 內(nèi)核開(kāi)發(fā)者認(rèn)為關(guān)閉所有中斷的代價(jià)太高,因此沒(méi)有必要提供這個(gè)能力。如果讀者使用的老驅(qū)動(dòng)程序調(diào)用了類(lèi)似cli和sti這樣的函數(shù),為了該驅(qū)動(dòng)程序能夠在2.6下使用,則需要進(jìn)行修改而使用正確的鎖。
in_interrupt()是判斷當(dāng)前進(jìn)程是否處于中斷上下文,這個(gè)中斷上下文包括底半部和硬件中斷處理過(guò)程,
函數(shù)實(shí)現(xiàn):
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判斷中斷計(jì)數(shù)和底半部計(jì)數(shù)是否〉0,如果只希望判斷是否在硬件中斷上下文,則可以使用:in_irq()。
總結(jié)
以上是生活随笔為你收集整理的local_irq_disable的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux I2C子系统分析之(一) -
- 下一篇: 关于中断处理程序中的关中断函数disab