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