ARM中斷向量表與響應(yīng)流程_第1頁
ARM中斷向量表與響應(yīng)流程_第2頁
ARM中斷向量表與響應(yīng)流程_第3頁
ARM中斷向量表與響應(yīng)流程_第4頁
ARM中斷向量表與響應(yīng)流程_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一 首先中斷向量表定義在哪里?如何加載? 二 中斷向量表與 中斷服務(wù)程序三 處理流程/一 首先中斷向量表定義在哪里?_vectors_start 首先中斷向量表定義的是什么? 定義的就是中斷服務(wù)程序的跳轉(zhuǎn)指令,因?yàn)槊總€中斷向量在向量表中只有一個字節(jié)的存儲空間,只能存放一條指令,所以通常存放跳轉(zhuǎn)指令,使程序跳轉(zhuǎn)到存儲器的其他地方,再執(zhí)行中斷處理。這里cpu就可以找中斷服務(wù)程序,跳轉(zhuǎn)指令如 例如:LDR PC, =ISR_HANDLER;或者指令與不同的cpu平臺有關(guān)系。 1.1 vector表定義的方式:往往是變量地址:如 . .globl _vectors_start 定義

2、_vectors_start符號,這樣外部程序可以訪問到。entry-armv.S_vectors_start: swi SYS_ERROR0 b vector_und + stubs_offset ldr pc, .LCvswi + stubs_offset b vector_pabt + stubs_offset b vector_dabt + stubs_offset b vector_addrexcptn + stubs_offset b vector_irq + stubs_offset b vector_fiq + stubs_offsetARM的異常處理向量表在entry-arm

3、v.S文件中:1.2 中斷向量表 類型 From ARM .globl _vectors_start 定義_vectors_start符號,這樣外部程序可以訪問到。_vectors_start:定義異常(地址邏輯自上而下0x00-0x1c) 跟具體的cpu 特性有關(guān) ARM(        swi        SYS_ERROR0        

4、)向量0:reset,但是這里被修改了,如果是cpu跑到了0地址,用軟件中斷SYS_ERROR0來處理. THUMB(        svc        #0                )向量1 THUMB(     

5、60;  nop                        )向量2W(b)        vector_und + stubs_offset 向量3 #未定義指令異常W(ldr)      &#

6、160; pc, .LCvswi + stubs_offset 向量4#軟中斷W(b)        vector_pabt + stubs_offset #向量5指令預(yù)取異常中斷(Prefetch Abort )W(b)        vector_dabt + stubs_offset #向量6數(shù)據(jù)中止W(b)        vector_ad

7、drexcptn + stubs_offset #向量7地址異常These aren't too critical.W(b)        vector_irq + stubs_offset #向量8.IRQ(一般中斷)W(b)        vector_fiq + stubs_offset #向量9 FIQ(快速中斷)  /*關(guān)于.globl指令:    .global/.globl

8、命令     .global symbol     .global 使得連接程序(ld)能夠識別 symbl    聲明symbol是全局可見的。標(biāo)號_start是GNU鏈接器用來指定第一個要執(zhí)行指令所必須的,同樣的是全局可見的(并且只能出現(xiàn)在一個模塊中)     例如:        .global _start    #定義 _start 為外部程序可以訪問的標(biāo)簽  _vectors

9、_start符號,又存放在哪里呢?有不同的方式,可以指定加載的ram地址,如kernelarchc6xkernel平臺SECTIONS/* * Start kernel read only segment */READONLY_SEGMENT_START .vectors :_vectors_start = .;*(.vectors). = ALIGN(0x400);_vectors_end = .;指定好了vector在內(nèi)核鏡像加載到內(nèi)存后的地址0x400; 但是arm就不指定,如下,在啟動之后存放的地址:/中斷服務(wù)處理程序 c000b500 T _kuser_helpe

10、r_start c000b500 t _kuser_memory_barrier c000b520 t _kuser_cmpxchg c000b540 t _kuser_get_tls c000b55c t _kuser_helper_version c000b560 T _kuser_helper_end c000b560 T _stubs_start /中斷服務(wù)處理程序 c000b560 t vector_irq c000b5e0 t vector_dabt c000b660 t vector_pabt c000b6e0 t vector_und c000b760 t vector_fiq

11、 c000b764 t vector_addrexcptn c000b784 T _stubs_end c000b784 T _vectors_start中斷向量表的起始地址 32字節(jié) c000b7a4 T _vectors_end  2.其次 向量表在系統(tǒng)bootup的時候被鏈接在哪里?/out/target/product/huaqin82_cwet_kk/obj/KERNEL_OBJ/arch/arm/kernel/entry-armv.o 打包成build-in.o 3,最后內(nèi)核建立向量表vector的拷貝_trap_init函數(shù)填充后的向量表如下:虛擬地

12、址 異常 處理匯編代碼0xffff0000 reset swi SYS_ERROR00xffff0004 undefined b _real_stubs_start + (vector_undefinstr - _stubs_start)0xffff0008 軟件中斷 ldr pc, _real_stubs_start + (.LCvswi - _stubs_start)0xffff000c 取指令異常 b _real_stubs_start + (vector_prefetch - _stubs_start)0xffff0010 數(shù)據(jù)異常 b _real_stubs_start + (vec

13、tor_data - _stubs_start)0xffff0014 reserved b _real_stubs_start + (vector_addrexcptn - _stubs_start)0xffff0018 irq b _real_stubs_start + (vector_IRQ - _stubs_start)0xffff001c Fiq b _real_stubs_start + (vector_FIQ - _stubs_start) / 二 中斷向量表與 中斷服務(wù)程序 總的來說對于中斷向量表的定義和存放(加載)和處理流程如下:首先理解相關(guān)概念: 

14、;中斷控制器負(fù)責(zé)(1)屏蔽和過濾中斷信號(2)喚醒cpu。分為向量中斷模式和非向量中斷模式:-向量中斷模式用于RESET、NMI、異常處理。當(dāng)向量中斷產(chǎn)生時,控制器直接將PC賦值,如IRQ異常 跳到0x0000000d處,而在0x0000000d地址處通常放置ISR服務(wù)程序地址LDR PC, =ISR_HANDLER。 -非向量中斷模式,有一個寄存器標(biāo)識位,跳轉(zhuǎn)到統(tǒng)一的函數(shù)地址,此函數(shù)通過判別寄存器標(biāo)識位和優(yōu)先級關(guān)系進(jìn)行中斷-處理。跳轉(zhuǎn)指令:我分為兩種: 1是中斷控制器的跳轉(zhuǎn)指令(實(shí)際上編譯好的機(jī)器碼):為何需要?因?yàn)楫?dāng)cpu在中斷發(fā)生的時候,cpu如何知道把pc指針執(zhí)行哪里去執(zhí)行指

15、令呢。所以通過中斷控制器的跳轉(zhuǎn)指令幫助把cpu的執(zhí)行指針pc,執(zhí)行相應(yīng)的中斷向量表。  2是cpu相關(guān)的跳轉(zhuǎn)指令,如arm處理器:b bl ,ldr等:完成跳轉(zhuǎn)到不同的中斷服務(wù)處理程序。    1)中斷服務(wù)程序 定義在哪里?如arm的dataabort異常處理程序:首先跳轉(zhuǎn)指令:b vector_dabt + stubs_offset ->這個地址的指令定義也在entry-armv.S: vector_stub dabt, ABT_MODE, 8-_dabt_svc (內(nèi)核模式發(fā)生dataabort) 或者 _dabt_usr(用戶模式發(fā)

16、生dataabort)-dabt_helper是一個宏->bl        CPU_DABORT_HANDLER 2)存放(加載)的地址?中斷向量表定義好了之后,存放了ram的哪里呢?也就是_vectors_start存在內(nèi)存什么地址? 答案:可以定在你需要的任何可訪問ram地址(這里指的虛擬地址,不是物理ram地址)。 例子1 :單片機(jī)非向量中斷模式假定非向量中斷表定義在0x00400000開始的外部RAM空間: 引用網(wǎng)絡(luò) 圖2 中斷解析示例流程  圖2中

17、實(shí)線表示的流程都用ARM匯編語言編寫,一般作為boot代碼的一部分放在系統(tǒng)的底層模塊中。填寫向量表的操作可以在上層應(yīng)用程序中方便地實(shí)現(xiàn),比如在C語言中: *( int *(0x00400018) = (int) ISR_IRQ;這樣就將IRQ中斷的服務(wù)程序入口地址(0x00300260)填寫到中斷向量表中的固定地址0x00400018開始的4字節(jié)空間了。  簡單說就是:在0x00000018 的地址的跳轉(zhuǎn)指令是:B 0x00000600 ;而0x00000600 存放的指令是:ldr r0 =0x004000018 ; 而0x004000018 存放的是0x00300260

18、:=中斷的服務(wù)程序ISR_IRQ的入口地址(0x00300260)  例子2:ARM 的vector 表 是存放在 c000b500 T _kuser_helper_start c000b500 t _kuser_memory_barrier c000b520 t _kuser_cmpxchg c000b540 t _kuser_get_tls c000b55c t _kuser_helper_version c000b560 T _kuser_helper_end c000b560 T _stubs_start c000b560 t vector_irq c000b5e0

19、 t vector_dabt c000b660 t vector_pabt c000b6e0 t vector_und c000b760 t vector_fiq c000b764 t vector_addrexcptn c000b784 T _stubs_end c000b784 T _vectors_start中斷向量表的起始地址 c000b7a4 T _vectors_end內(nèi)核建立vector的拷貝_trap_init函數(shù)填充后的向量表如下:虛擬地址 異常 處理匯編代碼0xffff0000 reset swi SYS_ERROR00xffff0004 undefined b _real

20、_stubs_start + (vector_undefinstr - _stubs_start)0xffff0008 軟件中斷 ldr pc, _real_stubs_start + (.LCvswi - _stubs_start)0xffff000c 取指令異常 b _real_stubs_start + (vector_prefetch - _stubs_start)0xffff0010 數(shù)據(jù)異常 b _real_stubs_start + (vector_data - _stubs_start)0xffff0014 reserved b _real_stubs_start + (vec

21、tor_addrexcptn - _stubs_start)0xffff0018 irq b _real_stubs_start + (vector_IRQ - _stubs_start)0xffff001c Fiq b _real_stubs_start + (vector_FIQ - _stubs_start)-為何內(nèi)核要拷貝到0xffff0000?這個是arm cpu的規(guī)定:對于ARMv4及其以上的版本,異常向量表的起始位置由協(xié)處理器15(cp15)的控制寄存器(c1)里的V位(bit13)有關(guān),當(dāng)V=時,異常向量表的起始位置在0x00000000,而當(dāng)V=時,異常向量表就起始于0xff

22、ff0000位置。當(dāng)有異常發(fā)生時,處理器會跳轉(zhuǎn)到對應(yīng)的0xffff0000起始的向量處取指令,然后,通過b指令散轉(zhuǎn)到異常處理代碼因?yàn)锳RM中b指令是相對跳轉(zhuǎn),而且只有+/-32MB的尋址范圍,所以把_stubs_start_stubs_end之間的異常處理代碼復(fù)制到了0xffff0200起始處這里可直接用b指令跳轉(zhuǎn)過去,這樣比使用絕對跳轉(zhuǎn)(ldr)效率高。 三 處理流程? cpu發(fā)生中斷的時候,PC指針如何知道到0x000000-0x0000001c(linux內(nèi)核copy到0xffff0000)的 地址(也就是到中斷向量表vector中哪一種異常:swi,數(shù)據(jù)異常,irq等)去執(zhí)行

23、中斷跳轉(zhuǎn)指令呢?答案是:中斷控制器完成。如下:  (來自網(wǎng)絡(luò)ppt)向量中斷模式用于RESET、NMI、異常處理。當(dāng)向量中斷產(chǎn)生時,控制器直接將PC賦值,如跳到0x0000000d處,而在0x0000000d地址處通常放置ISR服務(wù)程序地址。 處理流程分為兩部分:如下 1。硬件部分:EINT or IRQ硬件信號-中斷控制器跳轉(zhuǎn)-到對應(yīng)的異常-(硬件do it)-改變pc指針的地址-2。軟件部分:中斷向量表 跳轉(zhuǎn)指令(如b _real_stubs_start)-對應(yīng)的中斷處理程序,比如一般的irq流程 -entry-armv.S -vector_stub 

24、;       irq, IRQ_MODE, 4 -).macro vector_stub, name, mode, correction=0(完成中斷現(xiàn)場保護(hù),CPU異常模式切換)-) 根據(jù)進(jìn)入中斷前的工作模式不同,程序下一步將跳轉(zhuǎn)到_irq_usr 、或_irq_svc等位置.long        _irq_usr          

25、0;              0 (USR_26 / USR_32).long        _irq_invalid                      

26、60;  1 (FIQ_26 / FIQ_32).long        _irq_invalid                         2 (IRQ_26 / IRQ_32).long      &

27、#160; _irq_svc                         3 (SVC_26 / SVC_32)  -_irq_usr定義如下:_irq_usr:usr_entrykuser_cmpxchg_checkirq_handlerget_thread_info tskmov    &#

28、160;   why, #0b        ret_to_user_from_irq UNWIND(.fnend                )ENDPROC(_irq_usr)  -irq_handler定義如下:.macro       &#

29、160;irq_handler#ifdef CONFIG_MULTI_IRQ_HANDLERldr        r1, =handle_arch_irqmov        r0, spadr        lr, BSYM(9997f)ldr        pc, r1#el

30、search_irq_handler_default#endif -arm/include/asm/entry-macro-multi.S:6:        .macro        arch_irq_handler_default:.macro        arch_irq_handler_defaultget_irqnr_preamble

31、 r6, lr1:        get_irqnr_and_base r0, r2, r6, lr#get_irqnr_and_base函數(shù)完成獲取IRQ中斷號(irq number),依賴不同的soc的中斷控制器movne        r1, sp routine called with r0 = irq number, r1 = struct pt_regs *adrne        lr, BSYM(1b)bne        asm_do_IRQ 

溫馨提示

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

最新文檔

評論

0/150

提交評論