資源描述:
《ARM Linux中斷源碼分析(2)——中斷處理流程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、ARMLinux中斷源碼分析(2)——中斷處理流程ARM支持7類異常中斷,所以中斷向量表設(shè)8個(gè)條目,每個(gè)條目4字節(jié),共32字節(jié)。?異常名稱中斷向量異常中斷模式優(yōu)先級(jí)復(fù)位0x0特權(quán)模式1未定義的指令0x4未定義指令中止模式6軟件中斷0x8特權(quán)模式6指令預(yù)取中止0x0c中止模式5數(shù)據(jù)訪問中止0x10中止模式2保留0x14??外部中斷請(qǐng)求IRQ0x18IRQ模式4快速中斷請(qǐng)求FIQ0x1cFIQ模式3?回顧第一節(jié)所講的內(nèi)容,當(dāng)一個(gè)異?;蛑袛喟l(fā)生時(shí),處理器會(huì)將PC設(shè)置為特定地址,從而跳轉(zhuǎn)到已經(jīng)初始化好的異常向量表。因此,要理清中斷處理流程,先從異常向量表開始。對(duì)于ARMLinux而言,異常
2、向量表和異常處理程序都存在arch/arm/kernel/entry_armv.S匯編文件中。vector異常向量表點(diǎn)擊(此處)折疊或打開1..globl????__vectors_start2.__vectors_start:3.????swi????SYS_ERROR04.????b????vector_und?+?stubs_offset5.????ldr????pc,?.LCvswi?+?stubs_offset6.????b????vector_pabt?+?stubs_offset7.????b????vector_dabt?+?stubs_offset8.????b?
3、???vector_addrexcptn?+?stubs_offset9.????b????vector_irq?+?stubs_offset@中斷入口,vector_irq10.????b????vector_fiq?+?stubs_offset11.12.????.globl????__vectors_end1.__vectors_end:vector_irq+stubs_offset為中斷的入口點(diǎn),此處之所以要加上stubs_offset,是為了實(shí)現(xiàn)位置無關(guān)編程。首先分析一下stubs_offset(宏)是如何計(jì)算的:.equ?stubs_offset,__vectors_s
4、tart+0x200-__stubs_start在第3節(jié)中已經(jīng)提到,內(nèi)核啟動(dòng)時(shí)會(huì)將異常向量表拷貝到0xFFFF_0000,將異常向量處理程序的stub拷貝到0xFFFF_0200。圖5-1描述了異常向量表和異常處理程序搬移前后的內(nèi)存布局。圖5-1?異常向量表和異常處理程序搬移前后對(duì)比當(dāng)匯編器看到B指令后會(huì)把要跳轉(zhuǎn)的標(biāo)簽轉(zhuǎn)化為相對(duì)于當(dāng)前PC的偏移量(±32M)寫入指令碼。由于內(nèi)核啟動(dòng)時(shí)中斷向量表和stubs都發(fā)生了代碼搬移,所以如果中斷向量表中仍然寫成bvector_irq,那么實(shí)際執(zhí)行的時(shí)候就無法跳轉(zhuǎn)到搬移后的vector_irq處,因?yàn)橹噶畲a里寫的是原來的偏移量,所以需要把指令碼
5、中的偏移量寫成搬移后的。設(shè)搬移后的偏移量為offset,如圖5-1所示,offset=L1+L2?????=[0x200-(irq_PC_X-__vectors_start_X)]+(vector_irq_X-__stubs_start_X)?????=[0x200-(irq_PC-__vectors_start)]+(vector_irq-__stubs_start)?????=0x200-irq_PC+__vectors_start+vector_irq-__stubs_start?????=vector_irq+(__vectors_start+0x200-__stubs_s
6、tart)-irq_PC令stubs_offset=__vectors_start+0x200-__stubs_start則offset=vector_irq+stubs_offset-irq_PC,所以中斷入口點(diǎn)為“b???????vector_irq+stubs_offset”,其中減去irq_PC是由匯編器在編譯時(shí)完成的。vector_irq處理函數(shù)在分析vector_irq處理函數(shù)之前,先了解一下當(dāng)一個(gè)異常或中斷導(dǎo)致處理器模式改變時(shí),ARM處理器內(nèi)核的處理流程如下圖所示:????中斷剛發(fā)生時(shí),處理器處于irq模式。在__stubs_start和__stubs_end之間找到
7、vector_irq處理函數(shù)的定義vector_stubirq,IRQ_MODE,4,其中vector_stub是一個(gè)宏(在arch/arm/kernel/entry_armv.S中定義),為了分析更直觀,我們將vector_stub宏展開如下:1./*2.?*?Interruptdispatcher3.?*/4.????vector_irq:5.????.if?41.????sub????lr,?lr,?#4?@在中斷發(fā)生時(shí),lr指向最后執(zhí)行的指令地址加上8。只有在