local_irq_save和 local_irq_restore關閉和開啟中斷
阿新 • • 發佈:2018-12-10
如果你要禁止所有的中斷該怎麼辦?
在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下使用,則需要進行修改而使用正確的鎖。