ARM Linux中斷源碼分析(2)——中斷處理流程

ARM Linux中斷源碼分析(2)——中斷處理流程

ID:42594685

大?。?06.48 KB

頁數(shù):23頁

時(shí)間:2019-09-18

ARM Linux中斷源碼分析(2)——中斷處理流程_第1頁
ARM Linux中斷源碼分析(2)——中斷處理流程_第2頁
ARM Linux中斷源碼分析(2)——中斷處理流程_第3頁
ARM Linux中斷源碼分析(2)——中斷處理流程_第4頁
ARM Linux中斷源碼分析(2)——中斷處理流程_第5頁
資源描述:

《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。只有在

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。