Linux系統中斷處理程式設計

2021-07-04 22:37:18 字數 1428 閱讀 4911

與裸機中斷處理流程相似,linux系統的中斷處理流程如下:

①中斷產生時,系統跳轉到統一的中斷入口irq_svc處執行

②獲取中斷號

③根據中斷號找到結構陣列irq_desc中對應的一項,irq_desc結構是中斷處理描述符

④從irq_desc結構中找到中斷處理函式

由於獲取中斷號並跳轉到相應的處理函式去執行是由核心完成的,因此程式設計師編寫中斷程式的工作有:

①實現中斷處理函式

②註冊中斷處理函式到linux核心中,即使中斷號和中斷處理函式建立聯絡

③解除安裝驅動時也需要登出中斷

linux系統中request_irq函式用於註冊中斷,成功則返回0,失敗返回乙個錯誤編碼

request_irq

原型:int request_irq(unsigned int irq,void (*handler)(int, void*, struct pt_regs *), unsigned long flags,const char *devname,void *dev_id)

標頭檔案:功能:註冊中斷

handler:中斷處理函式指標

flags:與中斷管理有關的選項

devname:裝置名

dev_id:共享中斷時使用,共享中斷號的不同裝置應該要有不同的dev_id

flags選項常用的值有:

快/慢速中斷的主要區別在於:快速中斷保證中斷處理的原子性(不被打斷),而慢速中斷則不保證。換句話說,也就是「開啟中斷」標誌位(處理器if)在執行快速中斷處理程式時是關閉的,因此在服務該中斷時,不會被其他型別的中斷打斷;而呼叫慢速中斷處理時,其它型別的中斷仍可以得到服務。

多個裝置共享同一中斷號:乙個中斷號與多個裝置的中斷處理函式相關聯。共享的這些裝置其中乙個發生中斷就會跳轉到中斷函式去處理,由於這乙個中斷號與多個裝置的中斷函式相關聯,因此會執行多個中斷處理函式。雖然執行多個中斷處理函式,但由於每個中斷處理函式都會在開頭進行自檢判斷是否由對應的裝置產生中斷,若不是則結束函式。如串列埠和網絡卡共享同一中斷號,當串列埠發生中斷時,系統會依次執行串列埠的中斷處理函式和網絡卡的中斷處理函式。由於該中斷不是由網絡卡產生的,所以網絡卡的中斷處理函式在進行自檢後直接結束函式的執行。

中斷處理函式的特別之處是在中斷上下文中執行的,它的行為受到某些限制:

①不能使用可能引起阻塞的函式

②不能使用可能引起排程的函式

一般來說,中斷處理函式的任務是:

①檢查裝置是否產生中斷

②清除中斷產生標誌

③完成相應的硬體操作

當裝置不再需要使用中斷時(通常在驅動解除安裝時),應當把它們登出,使用函式:

void free_irq(unsigned int irq, void *dev_id)
irq為中斷號,dev_id與註冊中斷時使用的引數dev_id相同,用於區分共享中斷的不同裝置

Linux作業系統 中斷 中斷處理 中斷上下部

中斷響應過程 中斷請求 cpu響應中斷,清除中斷標誌 保護現場 確定中斷號,響應中斷服務程式 中斷返回 恢復現場 1 中斷上半部 禁止響應其他中斷執行,下半部 開啟中斷執行 2 如果裝置使用中斷,相應的驅動程式就會註冊乙個中斷處理程式。註冊中斷處理程式 request irp 分配一條給定的中斷線。...

Linux中斷處理

裝置管理過程中,中斷號的申請是乙個非常重要的操作。當裝置發出中斷之後,硬體裝置根據intel cpu的通用處理過程,跳轉到了該中斷號對應的中斷相應函式處。在linux作業系統中,必定要跳到do irq函式處。在do irq 函式中,進行了一部分公共的中斷響應處理之後,根據已經入棧了的中斷號查詢裝置中...

Linux中斷和中斷處理

眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...