linux 禁止所有中斷


如果你需要禁止所有中斷如何? 在 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 到並口.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM