如果你需要禁止所有中斷如何? 在 2.6 內核, 可能關閉在當前處理器上所有中斷處理, 使用任一個下面 2 個函數(定義在 <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 下工作前更新它為使用正確的加鎖
[37] 盡管, 一些大系統明確使用中斷平衡機制來在系統間分散中斷負載.
[38] 這個 shortint 設備完成它的任務, 通過交替地寫入 0x00 和 0xff 到並口.
