




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一 首先中斷向量表定義在哪里?如何加載? 二 中斷向量表與 中斷服務(wù)程序三 處理流程/一 首先中斷向量表定義在哪里?_vectors_start 首先中斷向量表定義的是什么? 定義的就是中斷服務(wù)程序的跳轉(zhuǎn)指令,因?yàn)槊總€(gè)中斷向量在向量表中只有一個(gè)字節(jié)的存儲(chǔ)空間,只能存放一條指令,所以通常存放跳轉(zhuǎn)指令,使程序跳轉(zhuǎn)到存儲(chǔ)器的其他地方,再執(zhí)行中斷處理。這里cpu就可以找中斷服務(wù)程序,跳轉(zhuǎn)指令如 例如:LDR PC, =ISR_HANDLER;或者指令與不同的cpu平臺(tái)有關(guān)系。 1.1 vector表定義的方式:往往是變量地址:如 . .globl _vectors_start 定義
2、_vectors_start符號(hào),這樣外部程序可以訪問(wèn)到。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符號(hào),這樣外部程序可以訪問(wèn)到。_vectors_start:定義異常(地址邏輯自上而下0x00-0x1c) 跟具體的cpu 特性有關(guān) ARM( swi SYS_ERROR0
4、)向量0:reset,但是這里被修改了,如果是cpu跑到了0地址,用軟件中斷SYS_ERROR0來(lái)處理. 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)能夠識(shí)別 symbl 聲明symbol是全局可見(jiàn)的。標(biāo)號(hào)_start是GNU鏈接器用來(lái)指定第一個(gè)要執(zhí)行指令所必須的,同樣的是全局可見(jiàn)的(并且只能出現(xiàn)在一個(gè)模塊中) 例如: .global _start #定義 _start 為外部程序可以訪問(wèn)的標(biāo)簽 _vectors
9、_start符號(hào),又存放在哪里呢?有不同的方式,可以指定加載的ram地址,如kernelarchc6xkernel平臺(tái)SECTIONS/* * Start kernel read only segment */READONLY_SEGMENT_START .vectors :_vectors_start = .;*(.vectors). = ALIGN(0x400);_vectors_end = .;指定好了vector在內(nèi)核鏡像加載到內(nèi)存后的地址0x400; 但是arm就不指定,如下,在啟動(dòng)之后存放的地址:/中斷服務(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的時(shí)候被鏈接在哪里?/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ù)程序 總的來(lái)說(shuō)對(duì)于中斷向量表的定義和存放(加載)和處理流程如下:首先理解相關(guān)概念:
14、;中斷控制器負(fù)責(zé)(1)屏蔽和過(guò)濾中斷信號(hào)(2)喚醒cpu。分為向量中斷模式和非向量中斷模式:-向量中斷模式用于RESET、NMI、異常處理。當(dāng)向量中斷產(chǎn)生時(shí),控制器直接將PC賦值,如IRQ異常 跳到0x0000000d處,而在0x0000000d地址處通常放置ISR服務(wù)程序地址LDR PC, =ISR_HANDLER。 -非向量中斷模式,有一個(gè)寄存器標(biāo)識(shí)位,跳轉(zhuǎn)到統(tǒng)一的函數(shù)地址,此函數(shù)通過(guò)判別寄存器標(biāo)識(shí)位和優(yōu)先級(jí)關(guān)系進(jìn)行中斷-處理。跳轉(zhuǎn)指令:我分為兩種: 1是中斷控制器的跳轉(zhuǎn)指令(實(shí)際上編譯好的機(jī)器碼):為何需要?因?yàn)楫?dāng)cpu在中斷發(fā)生的時(shí)候,cpu如何知道把pc指針執(zhí)行哪里去執(zhí)行指
15、令呢。所以通過(guò)中斷控制器的跳轉(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 ->這個(gè)地址的指令定義也在entry-armv.S: vector_stub dabt, ABT_MODE, 8-_dabt_svc (內(nèi)核模式發(fā)生dataabort) 或者 _dabt_usr(用戶模式發(fā)
16、生dataabort)-dabt_helper是一個(gè)宏->bl CPU_DABORT_HANDLER 2)存放(加載)的地址?中斷向量表定義好了之后,存放了ram的哪里呢?也就是_vectors_start存在內(nèi)存什么地址? 答案:可以定在你需要的任何可訪問(wèn)ram地址(這里指的虛擬地址,不是物理ram地址)。 例子1 :?jiǎn)纹瑱C(jī)非向量中斷模式假定非向量中斷表定義在0x00400000開始的外部RAM空間: 引用網(wǎng)絡(luò) 圖2 中斷解析示例流程 圖2中
17、實(shí)線表示的流程都用ARM匯編語(yǔ)言編寫,一般作為boot代碼的一部分放在系統(tǒng)的底層模塊中。填寫向量表的操作可以在上層應(yīng)用程序中方便地實(shí)現(xiàn),比如在C語(yǔ)言中: *( int *(0x00400018) = (int) ISR_IRQ;這樣就將IRQ中斷的服務(wù)程序入口地址(0x00300260)填寫到中斷向量表中的固定地址0x00400018開始的4字節(jié)空間了。 簡(jiǎn)單說(shuō)就是:在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?這個(gè)是arm cpu的規(guī)定:對(duì)于ARMv4及其以上的版本,異常向量表的起始位置由協(xié)處理器15(cp15)的控制寄存器(c1)里的V位(bit13)有關(guān),當(dāng)V=時(shí),異常向量表的起始位置在0x00000000,而當(dāng)V=時(shí),異常向量表就起始于0xff
22、ff0000位置。當(dāng)有異常發(fā)生時(shí),處理器會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的0xffff0000起始的向量處取指令,然后,通過(guò)b指令散轉(zhuǎn)到異常處理代碼因?yàn)锳RM中b指令是相對(duì)跳轉(zhuǎn),而且只有+/-32MB的尋址范圍,所以把_stubs_start_stubs_end之間的異常處理代碼復(fù)制到了0xffff0200起始處這里可直接用b指令跳轉(zhuǎn)過(guò)去,這樣比使用絕對(duì)跳轉(zhuǎn)(ldr)效率高。 三 處理流程? cpu發(fā)生中斷的時(shí)候,PC指針如何知道到0x000000-0x0000001c(linux內(nèi)核copy到0xffff0000)的 地址(也就是到中斷向量表vector中哪一種異常:swi,數(shù)據(jù)異常,irq等)去執(zhí)行
23、中斷跳轉(zhuǎn)指令呢?答案是:中斷控制器完成。如下: (來(lái)自網(wǎng)絡(luò)ppt)向量中斷模式用于RESET、NMI、異常處理。當(dāng)向量中斷產(chǎn)生時(shí),控制器直接將PC賦值,如跳到0x0000000d處,而在0x0000000d地址處通常放置ISR服務(wù)程序地址。 處理流程分為兩部分:如下 1。硬件部分:EINT or IRQ硬件信號(hào)-中斷控制器跳轉(zhuǎn)-到對(duì)應(yīng)的異常-(硬件do it)-改變pc指針的地址-2。軟件部分:中斷向量表 跳轉(zhuǎn)指令(如b _real_stubs_start)-對(duì)應(yīng)的中斷處理程序,比如一般的irq流程 -entry-armv.S -vector_stub
24、; irq, IRQ_MODE, 4 -).macro vector_stub, name, mode, correction=0(完成中斷現(xiàn)場(chǎng)保護(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中斷號(hào)(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)廢水處理實(shí)驗(yàn)設(shè)計(jì)與效果評(píng)估
- 工業(yè)機(jī)器人技術(shù)在教學(xué)與培訓(xùn)中的應(yīng)用
- 工業(yè)控制系統(tǒng)數(shù)據(jù)安全防護(hù)
- 工業(yè)污染控制與綠色生產(chǎn)模式
- 工業(yè)機(jī)器人產(chǎn)品技術(shù)介紹與市場(chǎng)前景
- 工業(yè)污染防治的科技創(chuàng)新方案
- 工業(yè)節(jié)能與綠色制造技術(shù)探討
- 工業(yè)設(shè)計(jì)中的創(chuàng)新技術(shù)與設(shè)計(jì)理念研究
- 工業(yè)設(shè)計(jì)與智能產(chǎn)品開發(fā)策略探討
- 工業(yè)遺存建筑的再生利用研究
- 消化道穿孔患者的護(hù)理課件
- 作物栽培學(xué)智慧樹知到期末考試答案章節(jié)答案2024年中國(guó)農(nóng)業(yè)大學(xué)
- 汽車修理廠應(yīng)急預(yù)案汽修廠安全生產(chǎn)事故應(yīng)急救援綜合預(yù)案2019-2020新標(biāo)準(zhǔn)完整版實(shí)施文件
- 建筑智能化系統(tǒng)工程掛靠協(xié)議
- 司法鑒定的奧秘智慧樹知到期末考試答案2024年
- 2024春期國(guó)開電大專本科《教育學(xué)》在線形考 (形考論壇4)試題及答案
- MOOC 高速鐵路運(yùn)營(yíng)與維護(hù)-西南交通大學(xué) 中國(guó)大學(xué)慕課答案
- 11-輪藻植物門課件
- (2024年)健康評(píng)估教學(xué)教案心電圖檢查教案
- 方法模型:展開圖、還原立體圖形
- 2023年廣東省中考生物試卷(含答案)
評(píng)論
0/150
提交評(píng)論