[轉載學習]

前天去面試,問到了這個問題,在回答這個問題的時候,面試官說我理解的有此問題,其實還問到了對於中斷和異常的理解,現在整理一點資料出來,全當是複習吧。
1.什麼是異常,什麼是中斷?
說法一
中斷的描述主體是外設,而異常的描述主體是CPU。
中斷是一個過程,是CPU在執行當前的程序的過程中因硬件或軟件的原因插入了另一段程序運行的過程。
異常主要是從CPU角度,接受信號的。
中斷主要是從外設角度,向CPU發送信號。
說法二

異常是中斷的一種,異常非爲中斷異常(IRQ/FIQ)和非中斷異常(SVC/Undefine/Abort)

個人覺得,說法二應該是更專業和更好的理解,不過,面試官說應該是說法一,由於對於這兩種理解,我問了一些做驅動的朋友,他們說法大多也是出自這兩種,沒有定論,那就兩種都上,還是按個人理解,取第二種說法吧。

2.ARM異常種類及對應的處理器模式
ARM體系結構中存在7種異常處理。異常發生時,處理器會把PC指向一個特殊地址,這個地址放在存儲器中一個特定表中,稱爲異常向量表

畫個更直觀的圖來看一下

低地址向量表(從0x00000000開始) --裸板
高地址向量表(從0xFFFF0000開始) --帶操作系統
5種異常:
中斷異常:IRQ/FIQ
非中斷異常:SVC/Undefine/Abort

3.異常發生時的CPU處理步驟
(1)保存當前執行位置(將當前執行位置存入到R14--LR寄存器中)
(2)保存當前執行狀態(狀態保存到CPSR中)
(3)尋找中斷入口,即向量表地址(PC寄存器中加入東西)
(4)執行中斷處理程序
(5)中斷返回,繼續執行

思考一下:上面這兩大步究竟是在幹什麼?爲什麼要CPSR拷到SPSR,PC拷到LR_IRQ?爲什麼做這兩步?
CPSR-->SPSR 保存要執行哪條機器碼(要幹什麼?)
PC-->LR 保存要在哪裏執行(在哪裏執行?)
其實想透了非常簡單,爲什麼要這些什麼CPSR,SPSR,LR,PC搞這麼一堆寄存器,目的其實只有一個----知道要在哪裏幹什麼,SPSR中保存的是中斷的的機器碼,而LR_irq或LR_fiq中保存要執行的地址,這樣返回的時候,就知道我要在哪個位置執行異常產生前的機器碼了,僅此而已。拋開計算機這個東西,這個設計的原理其實是很簡單的,不過多了幾個英文縮寫的名稱的寄存器名字來嚇人而已。

當異常產生時,ARM Core:
1)拷貝CPSR到SPSR<mode>
2)設置適當的CPSR位
3)保存返回地址到LR_<mode>
4)設置PC爲相應的異常向量地址

返回時,異常處理需要
1)從SPSR_<mode>恢復CPSR
2)從LR_<mode>恢復PC
在以前的ARMCPU,如ARM720和ARM9/10中,中斷向量表的基地址只是0x00000000或是0xFFFF0000,在新的ARM11和Cotrex系列中,中斷向量表可以自行設置任意的基地址。

4.FIQ和IRQ
爲什麼FIQ叫快速中斷?
1)FIQ在中斷向量表中牌向量表的最末端(最上面),基本上可以不用再跳轉一次,就可以從異常地址處執行(少一層跳轉指令,就少了一次流水線的重新填充週期)
2)FIQ的CPU模式擁有獨立的R8--R12寄存器,其他的中斷模式都必須先保存別人的,用完後再恢復,而FIQ可以使用自己的私有寄存器,當然就更快一些。
這其中有三級流水線刷新的一些問題,網上有很多的資料,喜歡研究的,可以去看《大話處理器》裏面圖文並茂,講的非常清楚,面了一段時間,被問到了各種各樣的問題,不斷的補充與加強吧,轉型不容易,選擇了轉型,那就堅持下去。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章