local_irq_save和 local_irq_disable

 

1. 關中斷
可以通過下面兩個函數中的其中任何一個關閉當前處理器上的所有中斷處理,這兩個函數定義在 <asm/system.h>中:
void local_irq_save(unsigned long flags);
void local_irq_disable(void);
 
local_irq_save的調用把當前的中斷狀態(開或關)保存到flags中,然後禁用當前處理器上的中斷。注意, flags 被直接傳遞, 而不是通過指針來傳遞,這是由於local_irq_save被實現爲宏
local_irq_disable不保存狀態而關閉本地處理器上的中斷髮送; 只有我們知道中斷並未在其他地方被禁用的情況下,才能使用這個版本。
 
 
 
2. 開中斷
可通過如下函數打開中斷:
void local_irq_restore(unsigned long flags);
void local_irq_enable(void);
 
local_irq_restore將保存的flags狀態值恢復(即local_irq_save的入參flag), 恢復之前的狀態(開或關)。
local_irq_enable則無條件打開中斷。
 
在一個關閉中斷的環境中調用local_irq_disable和local_irq_enable後會破壞之前的中斷響應狀態。儘管調用local_irq_disable前是關中斷的環境,但是在調用local_irq_enable後卻變成開中斷,這顯然不是我們希望的
 
調用local_irq_restore後不一定會開啓中斷,只會恢復調用local_irq_save之前的中斷狀態,如果調用local_irq_save之前是開中斷,那麼就打開中斷;如果調用local_irq_save之前是關中斷,那麼就關閉中斷。
 
所以local_irq_save和local_irq_restore會更安全。
 
沒有方法全局禁用整個系統的所有中斷。 內核開發者認爲關閉所有中斷的代價太高,因此沒有必要提供這個能力。
 
 
 
發佈了165 篇原創文章 · 獲贊 114 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章