第一、二期銜接——4.3 字符驅動設備—簡述Linux中斷處理體系結構

簡述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中斷處理體系框架

在這裏插入圖片描述

  1. 發生中斷時,CPU進入異常,執行異常向量vertor_irq的代碼。
  2. vertor_irq中,最終會調用中斷處理的總入口函數asm_do_IRQ
  3. asm do IRQ根據中斷號調用 irq_desc數組項中的 handle_ irq
  4. handle irq會使用chip成員中的函數來設置硬件,比如清除中斷、禁止中斷、重新使能中斷等。
  5. handle irq逐個調用用戶在 action鏈表中註冊的處理函數。

所以,在實際編程中,需要初始化構造這些數據結構,

  • 比如 irq_desc數組項中的handle_ irq、chip等成員;
  • 用戶註冊中斷時就是構造 action鏈表;
  • 用戶卸載中斷時就是從 action鏈表中去除不需要的項。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章