目錄
中斷概念的引入
ARM架構中斷的流程
異常向量表
Linux系統對中斷的處理
ARM對程序和中斷的處理
Linux進程中斷處理
中斷概念的引入
如何理解中斷,我們可以進行如下抽象。把CPU看做一個母親,當它正在執行任務的時候,可以看為是一個母親在看書。此時可能發生許多不同的情況,比如說:遠處傳來貓叫聲、快遞敲門、房間中小孩子傳來哭聲,如上三種,其實都可以看做CPU的中斷,可以根據重要性來進行判斷是否要放下手頭中正在看的書(CPU暫時暫停處理任務去執行中斷)進行處理。
此時,還有可能發生如下情況,比如說地震了、突然掉下來一只蜘蛛、水突然燒開了,此時肯定是要停止看書去處理這些突發事件的(發生異常的時候,CPU必須馬上處理)。
如果這個母親決定去處理聽到的事,那么首先她需要先使用書簽夾在書上,記錄下當前看到的位置(保存現場),然后再去處理問題(處理異常),回來后,通過書簽找到之前閱讀的位置(恢復現場)。
ARM架構中斷的流程
ARM架構中斷的流程如下:
1、初始化
? ? ? ? 首先設置中斷源讓它們可以產生中斷(只有外界可以產生聲音,比如貓叫、小孩子哭等,才可以產生中斷),比如讓一個GPIO引腳可以產生中斷。然后設置中斷控制器,設置中斷的優先級、或者屏蔽某些中斷,比如耳朵聽見了,但是不想去處理,可以假裝沒有聽見,這樣就是屏蔽了某個中斷。最后需要開啟CPU的中斷總開關(如果母親是聾子的話,對于外界所有聲音都是無效的)
2、CPU執行任務
3、產生中斷
? ? ? ? 按下按鍵,中斷信號發給中斷控制器,中斷控制器再發給CPU。
4、CPU每執行一條指令都會檢查是否有異常/中斷產生(硬件決定)
5、發生異常/中斷,開始處理
? ? ? ? 對于不同異常,跳到不同地址執行處理(異常向量表),這些地址上是函數指針或者函數地址,用來處理不同的異常
6、保存現場、執行處理函數、恢復現場
異常向量表
當發生異常的時候,CPU會根據不同的異常來執行不同的處理。
從異常向量表跳轉過去處理異常的時候,首先會保護現場、處理異常最后恢復現場
Linux系統對中斷的處理
ARM對程序和中斷的處理
如何理解棧在進程、線程、中斷中的作用,我們需要先了解ARM是怎么處理程序的,ARM芯片屬于精簡指令集計算機,它對于內存是只有讀、寫操作的。
比如說我們要進行a=a+b的運算,那么我們需要先讀取a到CPU中,然后在讀取b到CPU中,在CPU中執行a+b,然后在寫入到a當中。
如果在看的更加細節,那么我們可以通過下圖來進行解釋。CPU首先會先取代碼,才能知道我們一步步要進行什么操作(這里代碼需要轉化為機器碼),我們首先把a的值取到R0寄存器中,然后把b的值取到R1寄存器中,讓R1、R0寄存器相加存放到R0寄存器,然后再把R0寄存器的值讀取到a中。
假如,此時發生了中斷,那么CPU是怎么進行處理的呢?
Linux進程中斷處理
當進程A執行到一半的時候發生了中斷,此時需要保存現場,然后執行中斷,再恢復現場。當進程A繼續執行,此時再次發生了中斷,繼續保存現場,執行中斷,恢復現場。定時器發現進程A的時間用完之后,會保存A的現場,然后恢復B的現場。(對于這個定時器個人理解為,單核CPU并發執行進程,每個進程執行一段時間切換,宏觀上看成并行)