ARM異常中斷機(jī)制.doc_第1頁(yè)
ARM異常中斷機(jī)制.doc_第2頁(yè)
ARM異常中斷機(jī)制.doc_第3頁(yè)
ARM異常中斷機(jī)制.doc_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ARM9(以S3C2410為例)中斷機(jī)制一、ARM異常機(jī)制介紹ARM9處理器有7種工作模式。分別是用戶模式(usr):ARM處理器正常的程序執(zhí)行狀態(tài)??焖僦袛嗄J?fiq):用于高速數(shù)據(jù)傳輸或通道處理。外部中斷模式(irq):用于通用的中斷處理。管理模式(svc):操作系統(tǒng)使用的保護(hù)模式。數(shù)據(jù)訪問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式。系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)。未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式。每種模式通過(guò)5位二進(jìn)制編碼進(jìn)行標(biāo)示:用戶模式10000快速中斷模式10001外部中斷模式10010管理模式10011數(shù)據(jù)訪問(wèn)終止模式10111未定義指令中止模式11011系統(tǒng)模式11111模式編碼存放在CPSR(程序當(dāng)前狀態(tài)寄存器)中的4:0??焖僦袛嗄J健⑼獠恐袛嗄J?、數(shù)據(jù)訪問(wèn)終止模式、未定義指令中止模式、管理模式稱為異常模式。異常類型具體含義復(fù)位當(dāng)處理器的復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行。未定義指令遇到不能處理的指令時(shí),產(chǎn)生未定義指令異常。軟件中斷該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令??墒褂迷摦惓C(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用。指令預(yù)取中止若處理器預(yù)取指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn),存儲(chǔ)器會(huì)向處理器發(fā)出中止信號(hào),但當(dāng)預(yù)取的指令被執(zhí)行時(shí),才會(huì)產(chǎn)生指令預(yù)取中止異常。數(shù)據(jù)中止若處理器數(shù)據(jù)訪問(wèn)指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn)時(shí),產(chǎn)生數(shù)據(jù)中止異常。IRQ(外部中斷請(qǐng)求)當(dāng)處理器的外部中斷請(qǐng)求引腳有效,且CPSR中的I位為0時(shí),產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過(guò)該異常請(qǐng)求中斷服務(wù)。FIQ(快速中斷請(qǐng)求)當(dāng)處理器的快速中斷請(qǐng)求引腳有效,且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。當(dāng)多個(gè)異常發(fā)生時(shí),處理器根據(jù)優(yōu)先級(jí)進(jìn)行處理。優(yōu)先級(jí) 1(最高)復(fù)位2數(shù)據(jù)中止3FIQ4IRQ5預(yù)取指令中止6(最低)未定義指令、SWI異常中斷發(fā)生時(shí),處理器執(zhí)行完當(dāng)前的指令,需要保存當(dāng)前執(zhí)行現(xiàn)場(chǎng),切換到相應(yīng)的異常模式,并跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序。中斷處理完成后,處理器返回現(xiàn)場(chǎng)執(zhí)行下條指令。異常處理一般過(guò)程如下:(1)把當(dāng)前工作模式中的下一條即將運(yùn)行的指令地址保存到R14中;(2)保存當(dāng)前CPSR到SPSR(保存程序狀態(tài)寄存器);(3)改寫CPSR中的工作模式為當(dāng)前產(chǎn)生異常的工作模式;(4)禁止IRQ(如果進(jìn)入FIQ則禁止FIQ);(5)跳轉(zhuǎn)到相應(yīng)異常向量表入口; 如果是復(fù)位異常處理會(huì)禁止所有中斷,另外由于不用返回,因此不需要作(1)(2)步。以上的異常處理操作都是由處理器自動(dòng)完成的。二、異常向量表Linux內(nèi)核啟動(dòng)時(shí),向量表的創(chuàng)建過(guò)程為:init/main.c-start_kernel()-trap_init()。trap_init函數(shù)位于/arch/$(ARCH)/kernel/traps.c中。trap_init函數(shù)中向量表創(chuàng)建的相關(guān)代碼如下:unsigned long vectors = CONFIG_VECTORS_BASE;memcpy(void *)vectors, _vectors_start, _vectors_end - _vectors_start);memcpy(void *)vectors + 0x200, _stubs_start, _stubs_end - _stubs_start);其中CONFIG_VECTORS_BASE是向量表的基地址。在ARM V4及V4T以后的大部分處理器中,向量表可以有兩個(gè)位置:一個(gè)是0,另一個(gè)是0xffff0000。通過(guò)CP15協(xié)處理器c1寄存器中V位(bit13)控制。V和異常向量表的對(duì)應(yīng)關(guān)系如下:V=0 0x000000000x0000001CV=1 0xffff00000xffff001CCONFIG_VECTORS_BASE的值在內(nèi)核的相關(guān)配置文件中定義。比如在/arch/arm/configs/s3c2410_defconfig中CONFIG_VECTORS_BASE=0xffff0000。異常向量表存放在_vectors_start至_vectors_end定義的空間內(nèi)。異常向量表的邏輯結(jié)構(gòu)(8*4個(gè)字節(jié))為:異常類型工作模式地址復(fù)位管理模式0x00000000未定義指令未定義指令中止模式0x00000004軟件中斷管理模式0x00000008中止(預(yù)取指令)數(shù)據(jù)訪問(wèn)終止模式0x0000000C中止(數(shù)據(jù))數(shù)據(jù)訪問(wèn)終止模式0x00000010保留0x00000014IRQ外部中斷模式0x00000018FIQ快速中斷模式0x0000001C 異常向量表的物理結(jié)構(gòu)位于arch/arm/kernel/entry-armv.S中,如下所示:.globl _vectors_start_vectors_start: swi SYS_ERROR0: b vector_und + stubs_offset /復(fù)位異常: ldr pc, .LCvswi + stubs_offset /未定義指令異常: b vector_pabt + stubs_offset /軟件中斷異常: b vector_dabt + stubs_offset /數(shù)據(jù)異常(預(yù)取指令中止、數(shù)據(jù)中止): b vector_addrexcptn + stubs_offset /保留: b vector_irq + stubs_offset /普通中斷異常: b vector_fiq + stubs_offset /快速中斷異常: .globl _vectors_end:_vectors_end:異常向量表中各種異常對(duì)應(yīng)位置上放置了一條跳轉(zhuǎn)指令,用于指向相應(yīng)異常的處理程序。_stubs_start至_stubs_end之間是異常處理程序的位置。stubs_offset的值為:.equ stubs_offset, _vectors_start + 0x200 - _stubs_start三、中斷處理中斷發(fā)生后,處理器執(zhí)行向量表中的b vector_irq + stubs_offset指令。接著根據(jù)進(jìn)入中斷前的具體工作模式,執(zhí)行irq_handler處理過(guò)程。irq_handler處理過(guò)程位于/arch/arm/kernel/entry-armv.S中,如下所示:.macro irq_handler 1: get_irqnr_and_base r0, r6, r5, lr 判斷中斷號(hào),通過(guò)R0返回 bne asm_do_IRQ 進(jìn)入中斷處理。 .endm中斷號(hào)的值是在和平臺(tái)相關(guān)的文件中決定的。比如IRQ_EINT0在include/asm/arch-s3c2410/irqs.h中定義。這說(shuō)明中斷號(hào)的具體值和硬件中斷掛起寄存器中的中斷號(hào)是不等的。asm_do_IRQ位于arch/arm/kernel/irq.c,如下所示:asmlinkage void _exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)struct pt_regs *old_regs = set_irq_regs(regs); struct irq_desc *desc = irq_desc + irq; /根據(jù)中斷號(hào)找到對(duì)應(yīng)的irq_desc。irq_desc 是外部中斷描述符表,用于存儲(chǔ)中斷的相關(guān)信息 desc_handle_irq(irq, desc);/ 根據(jù)中斷號(hào)和desc進(jìn)入中斷處理 irq_finish(irq); irq_exit(); set_irq_regs(old_regs);static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc) desc-handle_irq(irq, desc); /中斷處理 在include/linux/interrupt.h中定義了irqaction結(jié)構(gòu)體,如下所示:struct irqaction irq_handler_t handler; /中斷處理函數(shù),注冊(cè)時(shí)提供 unsigned long flags; /中斷標(biāo)志,注冊(cè)時(shí)提供 cpumask_t mask; /中斷掩碼 const char *name; /中斷名稱 void *dev_id; /設(shè)備id,本文后面部分介紹中斷共享時(shí)會(huì)詳細(xì)說(shuō)明這個(gè)參數(shù)的作用 struct irqaction *next; /如果有中斷共享,則繼續(xù)執(zhí)行, int irq; /中斷號(hào),注冊(cè)時(shí)提供 struct proc_dir_entry *dir; /指向IRQn相關(guān)的/p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論