1。中斷/異常相量的裝入和執(zhí)行方式。 中斷和異常都是異步發(fā)生的事件,當(dāng)該事件發(fā)生,系統(tǒng)將停止目前正在執(zhí)行的代碼轉(zhuǎn)而執(zhí)行事件響應(yīng)的服務(wù)程序。而事件服務(wù)程序的入口點就是中斷/異常向量所在的位置。arm的中斷向量可以是0x0開始的低地址向量,也可以是在ffff0000位置的高向量地址。wince下使用高地址作為trap區(qū),所以在ce下arm使用高地址向量。下面我們來了解一下中斷/異常向量的安裝和執(zhí)行過程。 在kernelstart的過程中通過程序?qū)⑷缦麓a復(fù)制到ffff0000的位置. vectorinstructions ldr pc, [pc, #0x3e0-8] ; reset ldr pc, [pc, #0x3e0-8] ; undefined instruction ldr pc, [pc, #0x3e0-8] ; svc ldr pc, [pc, #0x3e0-8] ; prefetch abort ldr pc, [pc, #0x3e0-8] ; data abort ldr pc, [pc, #0x3e0-8] ; unused vector location ldr pc, [pc, #0x3e0-8] ; irq ldr pc, [pc, #0x3e0-8] ; fiq 而在ffff03e0的位置放上如下的數(shù)據(jù),每一項(32bit)對應(yīng)一個異常的跳轉(zhuǎn)地址也就是wince的異常/中斷向量跳轉(zhuǎn)表。該表項的內(nèi)容就是發(fā)生異常后將要執(zhí)行的服務(wù)程序的入口地址。具體如下。 vectortable dcd -1 ; reset dcd undefexception ; undefined instruction dcd swihandler ; svc dcd prefetchabort ; prefetch abort if :def:armv4t :lor: :def:armv4i dcd oemdataaborthandler ; data abort else dcd dataaborthandler ; data abort endif dcd -1 ; unused vector dcd irqhandler ; irq dcd fiqhandler ; fiq 在上面的這些代碼/數(shù)據(jù)在內(nèi)存空間上按照上述要求放置好以后,每次觸發(fā)一個異常就自動運行到相應(yīng)跳轉(zhuǎn)表項所對應(yīng)的地址執(zhí)行。 2.異常/中斷服務(wù)程序 在arm下,由于有7種異常狀態(tài)包括reset、undef exception、software interrupt(swi)、prefech abort、dataabort、irq、fiq七種異常/中斷。reset僅在復(fù)位時發(fā)生,其他6種都是在系統(tǒng)運行時發(fā)生。當(dāng)任何一個異常發(fā)生并得到響應(yīng)時,arm 內(nèi)核自動完成以下動作: 拷貝 cpsr 到 spsr_<mode> 設(shè)置適當(dāng)?shù)?cpsr 位: 改變處理器狀態(tài)進入 arm 狀態(tài) 改變處理器模式進入相應(yīng)的異常模式 設(shè)置中斷禁止位禁止相應(yīng)中斷 更新 lr_<mode> 設(shè)置 pc 到相應(yīng)的異常向量 同時不管異常發(fā)生在arm 還是thumb 狀態(tài)下,處理器都將自動進入arm 狀態(tài)。并且中斷使能會自動被關(guān)閉。在這個時候由于部分通用寄存器是不同模式公用的,所以還需要保存這些將會被破壞的寄存器,待到處理完成的時候恢復(fù)這些寄存器被中斷前的狀態(tài)。另外在進入異常模式后,lr的值不一定就是我們所需恢復(fù)執(zhí)行的位置,該位置受到異常類型和流水線誤差的影響。在swi模式下,lr就是返回值。在irq和fiq中l(wèi)r=lr-4,dataabort下lr=lr-8;具體原因我們就不討論了,有興趣可以參看<基于arm 的嵌入式程序開發(fā)要點>一文。下面分別對這些服務(wù)程序進行分析。 2-1.undef exception服務(wù)程序 undef exception在執(zhí)行到過非法的指令時產(chǎn)生,通常來模擬一些處理器不支持的功能,如浮點運算。簡單說一下undef exception的過程:當(dāng)當(dāng)前指令為一條處理器不支持的指令時,處理器會自動動將該指令送交各協(xié)處理器(如mmu、fpu)處理,如果這些協(xié)處理器都無法識別這條指令的時候,就產(chǎn)生該異常。下面開始看相應(yīng)的代碼。 nested_entry & |