




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鋰電池負(fù)極材料市場運(yùn)行狀況與前景趨勢分析報(bào)告
- 2025-2030年中國鋼簾線市場發(fā)展現(xiàn)狀及前景趨勢分析報(bào)告
- 2025-2030年中國西樂器制造市場十三五規(guī)劃及投資策略研究報(bào)告
- 2025-2030年中國茄尼醇行業(yè)風(fēng)險(xiǎn)評估規(guī)劃研究報(bào)告
- 2025-2030年中國紅花籽油市場運(yùn)行狀況及未來發(fā)展趨勢預(yù)測報(bào)告
- 貴州應(yīng)用技術(shù)職業(yè)學(xué)院《傳熱學(xué)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 伊犁師范大學(xué)《中學(xué)思想政治課程與教學(xué)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 撫州職業(yè)技術(shù)學(xué)院《無機(jī)非金屬材料機(jī)械設(shè)備》2023-2024學(xué)年第二學(xué)期期末試卷
- 貴州工程應(yīng)用技術(shù)學(xué)院《經(jīng)濟(jì)寫作》2023-2024學(xué)年第二學(xué)期期末試卷
- 貴州中醫(yī)藥大學(xué)時珍學(xué)院《現(xiàn)代光學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 人教版小學(xué)四年級下冊《體育與健康》全冊教案
- 法律文書寫作(第五版)PPT完整全套教學(xué)課件
- 半導(dǎo)體制造技術(shù)導(dǎo)論
- 人教版四年級數(shù)學(xué)下冊教材分析精講課件
- 7S目視化管理標(biāo)準(zhǔn)
- 酒店成本管理系統(tǒng)PICC
- 產(chǎn)品手繪設(shè)計(jì)表現(xiàn)技法PPT完整全套教學(xué)課件
- GA/T 1988-2022移動警務(wù)即時通信系統(tǒng)功能及互聯(lián)互通技術(shù)要求
- 文科學(xué)術(shù)規(guī)范與學(xué)術(shù)論文寫作課件
- 人教版小學(xué)二年級體育下冊全冊教案
- 農(nóng)業(yè)政策學(xué)PPT完整全套教學(xué)課件
評論
0/150
提交評論