在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 對ARM異常(Exceptions)的理解

            對ARM異常(Exceptions)的理解

            作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
            所有的系統(tǒng)引導(dǎo)程序前面中會有一段類似的代碼,如下:

            .globl _start ;系統(tǒng)復(fù)位位置
            _start: b reset ;各個異常向量對應(yīng)的跳轉(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 ;快速中斷異常

            本文引用地址:http://www.biyoush.com/article/201611/318974.htm

            從中我們可以看出,ARM支持7種異常。問題時發(fā)生了異常后ARM是如何響應(yīng)的呢?第一個復(fù)位異常很好

            理解,它放在0x0的位置,一上電就執(zhí)行它,而且我們的程序總是從復(fù)位異常處理程序開始執(zhí)行的,因

            此復(fù)位異常處理程序不需要返回。那么怎么會執(zhí)行到后面幾個異常處理函數(shù)呢?
            看看書后,明白了ARM對異常的響應(yīng)過程,于是就能夠回答以前的這個疑問。
            當(dāng)一個異常出現(xiàn)以后,ARM會自動執(zhí)行以下幾個步驟:
            (1)把下一條指令的地址放到連接寄存器LR(通常是R14),這樣就能夠在處理異常返回時從正確的位置

            繼續(xù)執(zhí)行。
            (2)將相應(yīng)的CPSR(當(dāng)前程序狀態(tài)寄存器)復(fù)制到SPSR(備份的程序狀態(tài)寄存器)中。從異常退出的時

            候,就可以由SPSR來恢復(fù)CPSR。
            (3) 根據(jù)異常類型,強制設(shè)置CPSR的運行模式位。
            (4)強制PC(程序計數(shù)器)從相關(guān)異常向量地址取出下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應(yīng)的異常處理程

            序中。
            至于這些異常類型各代表什么,我也沒有深究。因為平常就關(guān)心reset了,也沒有必要弄清楚。
            ARM規(guī)定了異常向量的地址:
            b reset ; 復(fù)位 0x0
            ldr pc, _undefined_instruction ;未定義的指令異常 0x4
            ldr pc, _software_interrupt ;軟件中斷異常 0x8
            ldr pc, _prefetch_abort ;預(yù)取指令 0xc
            ldr pc, _data_abort ;數(shù)據(jù) 0x10
            ldr pc, _not_used ;未使用 0x14
            ldr pc, _irq ;慢速中斷異常 0x18
            ldr pc, _fiq ;快速中斷異常 0x1c
            這樣理解這段代碼就非常簡單了。碰到異常時,PC會被強制設(shè)置為對應(yīng)的異常向量,從而跳轉(zhuǎn)到相應(yīng)的

            處理程序,然后再返回到主程序繼續(xù)執(zhí)行。
            這些引導(dǎo)程序的中斷向量,是僅供引導(dǎo)程序自己使用的,一旦引導(dǎo)程序引導(dǎo)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的兩個主要作用:
            (1)安全性:規(guī)定訪問權(quán)限
            (2) 提供地址空間:把不連續(xù)的空間轉(zhuǎn)換成連續(xù)的。
            第2點是不是實現(xiàn)頁式存儲的意思?

            .globl _start ;系統(tǒng)復(fù)位位置
            _start: b reset ;各個異常向量對應(yīng)的跳轉(zhuǎn)代碼
            ldr pc, _undefined_instruction ;未定義的指令異常

            ……

            _undefined_instruction :
            .word undefined_instruction

            也許有人會有疑問,同樣是跳轉(zhuǎn)指令,為什么第一句用的是 b reset;
            而后面的幾個都是用ldr?

            為了理解這個問題,我們以未定義的指令異常為例。

            當(dāng)發(fā)生了這個異常后,CPU總是跳轉(zhuǎn)到0x4,這個地址是虛擬地址,它映射到哪個物理地址
            取決于具體的映射。
            ldr pc, _undefined_instruction
            相對尋址,跳轉(zhuǎn)到標(biāo)號_undefined_instruction,然而真正的跳轉(zhuǎn)地址其實是_undefined_instruction

            的內(nèi)容——undefined_instruction。那句.word的相當(dāng)于:
            _undefined_instruction dw undefined_instruction (詳見畢設(shè)筆記3)。
            這個地址undefined_instruction到底有多遠(yuǎn)就難說了,也許和標(biāo)號_undefined_instruction在同一個

            頁面,也許在很遠(yuǎn)的地方。不過除了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)的)

            。如果二者相距太遠(yuǎn),那么編譯器會報錯的




            關(guān)鍵詞: ARM異常Exception

            評論


            技術(shù)專區(qū)

            關(guān)閉