在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            arm處理器異常處理swi

            作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
            ARM處理器共有7中運(yùn)行模式:

            用戶模式(usr) -- 正常程序執(zhí)行模式

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

            |-- |-- 快速中斷模式(fiq) -- 用于高速數(shù)據(jù)傳輸和通道處理

            特 | 異 | 外部中斷模式(irq) -- 用于通常的中斷處理
            權(quán) --| 常 --| 管理員模式(svc) -- 供操作系統(tǒng)使用的一種保護(hù)模式
            模 | 模 | 數(shù)據(jù)訪問中止模式(abt) -- 用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)
            式 | 式 |-- 未定義指令中止模式(und) -- 用于支持通過軟件仿真硬件的協(xié)處理器
            |-- 系統(tǒng)模式(sys) -- 用于運(yùn)行特權(quán)級(jí)的操作系統(tǒng)任務(wù)

            特權(quán)模式:fiq、irq、svc、abt、und、sys -- 程序可以訪問所有的系統(tǒng)資源,也可以任意切換處理器模式
            異常模式:fiq、irq、svc、abt、und

            ARM異常中斷種類及優(yōu)先級(jí):
            優(yōu)先級(jí) 異常中斷名稱
            高 復(fù)位(reset)
            || 數(shù)據(jù)訪問中止(data abort)
            || 快速中斷請(qǐng)求(FIQ)
            || 外部中斷請(qǐng)求(IRQ)
            /||/ 指令預(yù)取中止(prefetch abort)
            // 軟中斷(SWI)
            低 未定義指令(undefined instruction)

            異常向量表:
            地址 異常中斷名稱 優(yōu)先級(jí)
            . .
            . .
            . .
            0x1c FIQ 3
            0x18 IRQ 4
            0x14 Reserved X
            0x10 Data Abort 2
            0x0c Prefetch Abort 4
            0x08 SWI 5
            0x04 Undefined Instruction 6
            0x00 Reset 1
            Vector Table可以位于0x0或者0xFFFF0000處(ARM720T、ARM9、ARM10..)
            優(yōu)先級(jí)為3的FIQ為什么放在地址0x1c處呢?當(dāng)初這么設(shè)計(jì)應(yīng)該是為了更加快速地響應(yīng)FIQ中斷,也就是說不在0x1c地
            址放跳轉(zhuǎn)指令,而是直接存放最關(guān)鍵的FIQ處理代碼在0x1c開始一段地址區(qū)域內(nèi)。

            異常進(jìn)入及返回:
            當(dāng)異常產(chǎn)生時(shí):
            1. 拷貝當(dāng)前模式的CPSR值到相應(yīng)異常模式的SPSR_,如:CPSR(usr) --> SPSR_svc(svc)。
            2. 設(shè)置適當(dāng)?shù)腃PSR位:
            改變處理器狀態(tài)進(jìn)入ARM狀態(tài)
            改變處理器模式進(jìn)入相應(yīng)的異常模式
            如果需要可以設(shè)置中斷禁止位禁止相應(yīng)中斷
            3. 保存返回地址(pc-4)到LR_。
            4. 設(shè)置pc為相應(yīng)的異常向量。
            異常返回時(shí),需要:
            1. 從SPSR_恢復(fù)CPSR。
            2. 從LR_恢復(fù)pc
            (只能在ARM狀態(tài)下實(shí)現(xiàn)該返回操作)
            異常返回的指令分析:
            * 使用一數(shù)據(jù)處理指令實(shí)現(xiàn),該指令帶“S”后綴,同時(shí)pc作為目的寄存器
            * 在特權(quán)模式下不僅僅要更新pc,而且還要拷貝SPSR到CPSR
            1. 從SWI和Undef異常返回:
            movs pc , lr
            這兩種異常都會(huì)在導(dǎo)致異常的指令執(zhí)行周期中就進(jìn)入異常,沒有等到下個(gè)時(shí)鐘周期才進(jìn)入異常,另外這兩種異常都是返回到產(chǎn)生異常指令的下一條指令去繼續(xù)執(zhí)行。我從前面可以知道lr中保存的就是pc-4(該pc值是產(chǎn)生異常指令的下下一條指令的地址),所以可以直接將lr的值送入pc。
            2. 從FIQ、IRQ和Prefect Abort返回:
            subs pc , lr , #4
            這三種異常都會(huì)等待產(chǎn)生異常的指令執(zhí)行完才會(huì)進(jìn)入異常,所以此刻的pc已經(jīng)更新,比如:
            ...
            subs r3, r3, #1 << 26 @ 0x100
            bcs 2b @ 0x104
            subs r1, r1, #1 << 5 @ 0x108
            bcs 1b @ 0x10b
            ...
            如果在執(zhí)行第1行地址為0x100指令時(shí),發(fā)生了上面三種異常,此刻的pc值為0x108,等第1行執(zhí)行完之后,pc更新為0x10b。同時(shí)進(jìn)入異常處理,在異常進(jìn)入時(shí)將lr值保存為pc-4,即0x108。那么在異常返回后,需要接著執(zhí)行發(fā)生異常指令的下一條指令的話就必須將lr的值減去4才能得到正確的地址,lr-4 = 0x108 - 4 = 0x104。
            3. 從數(shù)據(jù)異常(Data Abort)異常返回:
            該異常也是會(huì)等待產(chǎn)生異常的那條指令執(zhí)行完才會(huì)進(jìn)入異常,情況類似于第2類的三種異常,但是有一點(diǎn)不同的是:數(shù)據(jù)異常返回地址不是產(chǎn)生異常的下一條指令,而是產(chǎn)生異常的那條指令,所以,它的返回指令應(yīng)該是:
            subs pc , lr , #8
            按照上面的例子就應(yīng)該返回到地址0x100處繼續(xù)執(zhí)行。為什么會(huì)這樣,因?yàn)閿?shù)據(jù)異常返回后會(huì)繼續(xù)去取數(shù)據(jù),想想缺頁異常。
            4. 如果lr在進(jìn)入異常后被壓棧的話,就需要使用下面的指令來彈出。
            LDMFD sp! , {pc}^
            (^同時(shí)拷貝SPSR到CPSR中,這里的lr在壓棧之前已經(jīng)做了前面3中情況對(duì)應(yīng)的處理了)

            SWI異常:
            執(zhí)行SWI軟中斷指令即可產(chǎn)生軟中斷異常,進(jìn)入SWI異常時(shí)會(huì)做如下動(dòng)作:
            CSPR保存到SPSR_svc。
            改變處理器狀態(tài)進(jìn)入ARM狀態(tài)
            改變處理器模式進(jìn)入相應(yīng)的管理員模式(svc)
            看需要禁止中斷
            保存返回地址(pc-4)到LR_svc
            設(shè)置pc為0x08或者0xFFFF0008
            需要注意一點(diǎn)的是:如果在執(zhí)行SWI指令時(shí)系統(tǒng)正處于svc模式時(shí),那么將會(huì)覆蓋掉原來LR_svc的值。所以
            在SWI指令之前應(yīng)該對(duì)LR_svc壓棧保存。
            SWI異常返回時(shí),做如下動(dòng)作:
            從SPSR_svc恢復(fù)CPSR
            從LR_svc恢復(fù)pc,不需要修正

            在c語言中使用關(guān)鍵字“__swi”來定義一個(gè)軟中斷函數(shù):
            __swi(0x30) void my_swi(void);
            void fun(void)
            {
            my_swi();
            }
            -----> 轉(zhuǎn)換成匯編
            fun
            STMFD sp! , {lr}
            swi 0x24
            LDMFD sp! , {pc}

            swi調(diào)用帶參和swi處理函數(shù)帶參:
            swi調(diào)用帶參:
            使用swi指令時(shí),通常有兩種方法來傳遞參數(shù):
            1. 使用swi號(hào)
            swi指令的低24bits(ARM指令集)組成或者低8bits(Thumb指令集)來指定軟中斷號(hào),
            其余參數(shù)通過寄存器來傳遞。
            2. r0決定軟中斷號(hào),其余參數(shù)使用同樣寄存器傳遞。
            c語言中,關(guān)鍵字“__swi”定義的軟中斷函數(shù)允許最多4個(gè)參數(shù),使用r0~r4來傳遞。
            swi處理函數(shù)帶參:
            1. 匯編中,存取調(diào)用者設(shè)置的寄存器即可
            2. 傳參給c,通常才用壓棧的方法:
            將參數(shù)壓棧,給調(diào)用的函數(shù)傳遞一個(gè)指向這些參數(shù)的指針。

            獲取SWI號(hào):
            ARM core不提供直接傳遞軟中斷號(hào)到處理程序的機(jī)制,SWI處理程序必須定位SWI指令并提取SWI指令中的常數(shù)域
            1. 檢查SPSR_svc的Tbit,可以確定陷入swi異常之前的指令時(shí)ARM指令集還是Thumb指令集。
            2. 然后通過LR_svc的值確定SWI指令的地址。ARM狀態(tài)下是LR-4,而Thumb狀態(tài)下是LR-2的位置。
            3. SWI指令格式:
            ARM態(tài):
            31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
            | Cond |1 1 1 1 | SWI number |
            Thumb態(tài)
            15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
            | 1 1 0 1 1 1 1 1| SWI number |



            關(guān)鍵詞: arm處理器異常處理sw

            評(píng)論


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

            關(guān)閉