对ARM异常(Exceptions)的理解
生活随笔
收集整理的這篇文章主要介紹了
对ARM异常(Exceptions)的理解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
對ARM異常(Exceptions)的理解 1 .對 ARM 異常( Exceptions )的理解 所有的系統(tǒng)引導程序前面中會有一段類似的代碼,如下:
從中我們可以看出, ARM 支持 7 種異常。問題時發(fā)生了異常后 ARM 是如何響應的呢?第一個復位異常很好理解,它放在 0x0 的位置,一上電就執(zhí)行它,而且我們的程序總是從復位異常處理程序開始執(zhí)行的,因此復位異常處理程序不需要返回。那么怎么會執(zhí)行到后面幾個異常處理函數(shù)呢? 看看書后,明白了 ARM 對異常的響應過程,于是就能夠回答以前的這個疑問。 當一個異常出現(xiàn)以后, ARM 會自動執(zhí)行以下幾個步驟: ( 1 )把下一條指令的地址放到連接寄存器 LR( 通常是 R14) ,這樣就能夠在處理異常返回時從正確的位置繼續(xù)執(zhí)行。 ( 2 )將相應的 CPSR( 當前程序狀態(tài)寄存器 ) 復制到 SPSR (備份的程序狀態(tài)寄存器)中。從異常退出的時候,就可以由 SPSR 來恢復 CPSR 。 (3) 根據(jù)異常類型,強制設(shè)置 CPSR 的運行模式位。 ( 4 )強制 PC (程序計數(shù)器)從相關(guān)異常向量地址取出下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應的異常處理程序中。 至于這些異常類型各代表什么,我也沒有深究。因為平常就關(guān)心 reset 了,也沒有必要弄清楚。 ARM 規(guī)定了異常向量的地址: ?? b?????? reset??????????? ; 復位 0x0 ldr?pc, _undefined_instruction ;未定義的指令異常 0x4 ?????? ldr???? pc, _software_interrupt???? ;軟件中斷異常??? 0x8 ?????? ldr???? pc, _prefetch_abort????????? ;預取指令??? 0xc ?????? ldr???? pc, _data_abort?????????????? ;數(shù)據(jù)??????? 0x10 ?????? ldr???? pc, _not_used????????????????? ;未使用????? 0x14 ?????? ldr???? pc, _irq?????????????????????? ;慢速中斷異常?? 0x18 ?? ???? ldr?? pc, _fiq?????????????????????? ;快速中斷異常??? 0x1c 這樣理解這段代碼就非常簡單了。碰到異常時,PC會被強制設(shè)置為對應的異常向量,從而跳轉(zhuǎn)到相應的處理程序,然后再返回到主程序繼續(xù)執(zhí)行。 這些引導程序的中斷向量,是僅供引導程序自己使用的,一旦引導程序引導Linux內(nèi)核完畢后,會使用自己的中斷向量。 嗬嗬,這又有問題了。比如,ARM發(fā)生中斷(irq)的時候,總是會跑到0x18上執(zhí)行啊。那Linux內(nèi)核又怎么能使用自己的中斷向量呢?原因在于Linux內(nèi)核采用頁式存儲管理。開通MMU的頁面映射以后,CPU所發(fā)出的地址就是虛擬地址而不是物理地址 。就Linux內(nèi)核而言,虛擬地址0x18經(jīng)過映射以后的物理地址就是0xc000 0018。所以Linux把中斷向量放到0xc000 0018就可以了。 另外,說一下MMU。說句實話,還不是很明白這個MMU機理。 ? (1 )安全性:規(guī)定訪問權(quán)限 ?(2) 提供地址空間:把不連續(xù)的空間轉(zhuǎn)換成連續(xù)的。 第2點是不是實現(xiàn)頁式存儲的意思? 2005 年6月9日 晚 補充一下:? 05/06/14
.globl _start ;系統(tǒng)復位位置
_start: b reset ;各個異常向量對應的跳轉(zhuǎn)代碼
ldr pc, _undefined_instruction ;未定義的指令異常
……
_undefined_instruction :
.word undefined_instruction
也許有人會有疑問,同樣是跳轉(zhuǎn)指令,為什么第一句用的是 b reset;
而后面的幾個都是用ldr?
為了理解這個問題,我們以未定義的指令異常為例。
當發(fā)生了這個異常后,CPU總是跳轉(zhuǎn)到0x4,這個地址是虛擬地址,它映射到哪個物理地址
取決于具體的映射。
ldr pc, _undefined_instruction
相對尋址,跳轉(zhuǎn)到標號_undefined_instruction,然而真正的跳轉(zhuǎn)地址其實是_undefined_instruction的內(nèi)容——undefined_instruction。那句.word的相當于:
_undefined_instruction dw undefined_instruction (詳見畢設(shè)筆記3)。
這個地址undefined_instruction到底有多遠就難說了,也許和標號_undefined_instruction在同一個頁面,也許在 很遠的地方。不過除了reset,其他的異常是MMU開始工作之后才可能發(fā)生的,因此undefined_instruction 的地址也經(jīng)過了MMU的映射。
在剛加電的時候,CPU從0x0開始執(zhí)行,MMU還沒有開始工作,此時的虛擬地址和物理地址相同;另一方面,重啟在MMU開始工作后也有可能發(fā)生,如果reset也用ldr就有問題了,因為這時候虛擬地址和物理地址完全不同。
因此,之所以reset用b,就是因為reset在MMU建立前后都有可能發(fā)生,而其他的異常只有在MMU建立之后才會發(fā)生。用b reset,reset子程序與reset向量在同一頁面,這樣就不會有問題(b是相對跳轉(zhuǎn)的)。如果二者相距太遠,那么編譯器會報錯的。
| .globl _start??????????????????? ;系統(tǒng)復位位置 _start: b?????? reset??????????? ;各個異常向量對應的跳轉(zhuǎn)代碼 ??????? ldr???? pc, _undefined_instruction ;未定義的指令異常 ??????? ldr???? pc, _software_interrupt???? ;軟件中斷異常 ??????? ldr???? pc, _prefetch_abort????????? ;內(nèi)存操作異常 ??????? ldr???? pc, _data_abort?????????????? ;數(shù)據(jù)異常 ??????? ldr???? pc, _not_used????????????????? ;未使用 ??????? ldr???? pc, _irq?????????????????????? ;慢速中斷異常 ??????? ldr???? pc, _fiq?????????????????????? ;快速中斷異常 |
.globl _start ;系統(tǒng)復位位置
_start: b reset ;各個異常向量對應的跳轉(zhuǎn)代碼
ldr pc, _undefined_instruction ;未定義的指令異常
……
_undefined_instruction :
.word undefined_instruction
也許有人會有疑問,同樣是跳轉(zhuǎn)指令,為什么第一句用的是 b reset;
而后面的幾個都是用ldr?
為了理解這個問題,我們以未定義的指令異常為例。
當發(fā)生了這個異常后,CPU總是跳轉(zhuǎn)到0x4,這個地址是虛擬地址,它映射到哪個物理地址
取決于具體的映射。
ldr pc, _undefined_instruction
相對尋址,跳轉(zhuǎn)到標號_undefined_instruction,然而真正的跳轉(zhuǎn)地址其實是_undefined_instruction的內(nèi)容——undefined_instruction。那句.word的相當于:
_undefined_instruction dw undefined_instruction (詳見畢設(shè)筆記3)。
這個地址undefined_instruction到底有多遠就難說了,也許和標號_undefined_instruction在同一個頁面,也許在 很遠的地方。不過除了reset,其他的異常是MMU開始工作之后才可能發(fā)生的,因此undefined_instruction 的地址也經(jīng)過了MMU的映射。
在剛加電的時候,CPU從0x0開始執(zhí)行,MMU還沒有開始工作,此時的虛擬地址和物理地址相同;另一方面,重啟在MMU開始工作后也有可能發(fā)生,如果reset也用ldr就有問題了,因為這時候虛擬地址和物理地址完全不同。
因此,之所以reset用b,就是因為reset在MMU建立前后都有可能發(fā)生,而其他的異常只有在MMU建立之后才會發(fā)生。用b reset,reset子程序與reset向量在同一頁面,這樣就不會有問題(b是相對跳轉(zhuǎn)的)。如果二者相距太遠,那么編譯器會報錯的。
總結(jié)
以上是生活随笔為你收集整理的对ARM异常(Exceptions)的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六项激素检查多少钱啊?
- 下一篇: shell之“/dev/null 21”