簡述Linux中斷處理體系結構
- 硬件平臺:韋東山嵌入式Linxu開發板(S3C2440.v3)
- 軟件平臺:運行於VMware Workstation 12 Player下UbuntuLTS16.04_x64 系統
- 參考資料:《嵌入式Linux應用開發手冊》、《嵌入式Linux應用開發手冊第2版》、https://blog.csdn.net/juS3Ve/article/details/81437432
- 開發環境:Linux 2.6.22.6 內核、arm-linux-gcc-3.4.5-glibc-2.3.6工具鏈
目錄
一、棧
在介紹Linux中斷處理體系結構之前,先來介紹一下棧。
1、概念
"棧“者,存儲貨物或供旅客住宿的地方,可引申爲倉庫、中轉站,所以引入到計算機領域裏,就是指數據暫時存儲的地方,所以纔有進棧、出棧的說法。
棧,是一個線性表(數據結構),具有先進後出的特點。
2、場景舉例
在中斷的時候,我們通常需要到棧來進行保存現場的工作,下面通過一個場景來具體感受下棧的作用。
場景:在函數A中調用函數B
funA()
{
//funB()之前的其他操作
funB();
//funB()之後的其他操作
}
執行過程:
圖畫描述:
圖片來自:《嵌入式Linux應用開發手冊第2版》
文字解釋:
①、在執行funA()
中的funB()之前的其他操作
的指令時,根據翻譯的彙編碼正常執行。
②、當funB()之前的其他操作
的指令執行完畢後,進入到funB()
函數中,此時
{
首先:把funB()之前的其他操作
的指令的結果、數據、寄存器入棧,保存在程序A的棧中(瞬間完成);
之後:執行funB()
函數,把結果、數據、寄存器入棧,保存在程序B的棧中;;
最後:funB()
函數執行完畢後(是否釋放B棧資源看具體程序),把棧A中保存的結果、數據、寄存器重新拿出來;
}
③、執行funB()之後的其他操作
的指令。
二、Linux對中斷處理的演進
1、中斷分類
在Linux系統中,對中斷進行了拓展了,分爲你了硬件中斷和軟件中斷。
1.1 硬件中斷
硬件中斷是一個異步信號,表明需要注意,,或需要改變在執行一個同步事件。硬件中斷是由與系統相連的外設(比如網卡 硬盤 鍵盤等)產生的.。
1.2 軟件中斷
軟中斷的處理類似於硬中斷,但是軟中斷僅僅由當前運行的進程產生。
2、中斷處理原則
2.1 不能嵌套
中斷處理函數需要調用 C 函數,這就需要用到棧。
場景:假設中斷 A 正在處理的過程中,假設又發生了中斷 B,那麼在棧裏要保存 A 的現場,然後處理 B。在處理 B 的過程中又發生了中斷 C,那麼在棧裏要保存 B 的現場,然後處理 C。如果中斷嵌套突然暴發,那麼棧將越來越大,棧終將耗盡,系統會崩潰。
所以,爲了防止這種情況發生,也是爲了簡單化中斷的處理,在 Linux 系統上中斷無法嵌套:即當前中斷 A 沒處理完之前,不會響應另一箇中斷 B(即使它的優先級更高)。
拋轉:在中斷的下半部分可以相應其他中斷。
(參考資料:《嵌入式Linux應用開發手冊第2版》、https://blog.csdn.net/juS3Ve/article/details/81437432)
2.2 越快越好
在單芯片系統中,假設中斷處理很慢,那應用程序在這段時間內就無法執行:系統顯得很遲頓。
在中斷的處理過程中,該 CPU 是不能進行進程調度的,所以中斷的處理要越快越好,儘早讓其他中斷能
3、中斷的上半部與下半部
假如處理一箇中斷所消耗的時間過長,那麼對於整個系統來說,給人的感覺就是很卡頓的(特別是對於可視化應用),所以Linux就引出了中斷的上半部與下半部這個概念。
3.1 中斷的上半部
在關中斷(無法處理其他中斷)的狀態下,在關中斷下處理緊急的事情。
3.2 中斷的下半部
在開中斷(中斷允許打斷)的狀態下,處理非緊急的事情。
整個流程如下:假如在A中斷的下半部發生了B中斷,則B中斷結束後,回到A中斷下半部,此時A、B中斷的下半部,是彙集在一起處理的。
三、Linux中斷處理體系框架
- 發生中斷時,CPU進入異常,執行異常向量
vertor_irq
的代碼。 - 在
vertor_irq
中,最終會調用中斷處理的總入口函數asm_do_IRQ
。 asm do IRQ
根據中斷號調用irq_desc
數組項中的handle_ irq
。handle irq
會使用chip
成員中的函數來設置硬件,比如清除中斷、禁止中斷、重新使能中斷等。handle irq
逐個調用用戶在action鏈表
中註冊的處理函數。
所以,在實際編程中,需要初始化構造這些數據結構,
- 比如
irq_desc
數組項中的handle_ irq、chip
等成員; - 用戶註冊中斷時就是構造 action鏈表;
- 用戶卸載中斷時就是從 action鏈表中去除不需要的項。