資源描述:
《Linux中斷處理過程淺析.doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在學術論文-天天文庫。
1、linux中斷響應和處理過程:首先中斷屬于異常的一種。異常,就是可以打斷CPU正常運行流程的一些事情,比如說外部中斷,未定義的指定,試圖修改只讀數(shù)據(jù),執(zhí)行SWI指定(software?interrupt?instructin,軟件中斷指令,比如說上層調(diào)用sys_read,sys_write就會產(chǎn)生swi)等。內(nèi)核啟動時在start_kernel函數(shù)(init/main.c)中調(diào)用trap_init?,??init_IRQ兩個函數(shù)來設置異常的處理函數(shù)。trap_init函數(shù)(arch/arm/kernel/traps.c)void_i
2、nit?trap_init(void){......memcpy((void?*)vectors,?__vectors_start,?__vectors_end?-?__vectors_start);memcpy((void?*)vectors?+?0x200,?__stubs_start,?__stubs_end?-?__stubs_start);.......}上面兩條定義的是異常向量的存放地方,即:__stubs_start~~~~~?__stubs_end之間就是異常向量.接下來?我們看異常向量之間的定義:(arch/arm
3、/kernel/entry-armv.s).equ?stubs_offset,?__vectors_start?+?0x200?-?__stubs_start????.globl?__vectors_start__vectors_start:?ARM(?swi?SYS_ERROR0?)??????//復位時.CPU交執(zhí)行這條指令?THUMB(?svc?#0?)?THUMB(?nop?)W(b)?vector_und?+?stubs_offset???//未定義異常時,CPU將執(zhí)行這條跳轉(zhuǎn)指令W(ldr)?pc,?.LCvswi?+?
4、stubs_offset???//swi異常W(b)?vector_pabt?+?stubs_offset???//指令預取止W(b)?vector_dabt?+?stubs_offset???//數(shù)據(jù)訪問中止W(b)?vector_addrexcptn?+?stubs_offset??//沒有用到W(b)?vector_irq?+?stubs_offset?????????//irq中斷W(b)?vector_fiq?+?stubs_offset?????????//fig中斷?(快速中斷).globl?__vectors_end
5、__vectors_end:各種異常的處理函數(shù)可以分為五類,分別分布在下面不同的文件中:1、arch/arm/kernel/traps.c中???處理未定義指令異常,總?cè)肟诤瘮?shù)為do_undefinstr2、arch/arm/mm/fault.c???與內(nèi)存訪問相關的異常,總?cè)肟诤瘮?shù)為do_DataAbort,?do_PretftchAbort3.?arch/arm/mm/irq.c???中斷處理函數(shù)在這個文件中定義,總?cè)肟诤瘮?shù)為asm_do_IRQ4.?arch/arm/kernel/call.s??swi異常處理??比如說:sy
6、s_read,??sys_open等.5.?沒有使用的異常除了IRQ中斷外(FIG中斷l(xiāng)inux一般不使用),所有的異常內(nèi)核都定義了細致而完備的處理函數(shù).??所以我們這里關心的也只是上面紅色部分,即:IRQ中斷.Init_IRQ函數(shù)(arch/arm/kernel/irq.c),被用來初使化中斷的處理框架,設置各種中斷的默認處理函數(shù).Linux內(nèi)核將所有中斷統(tǒng)一編號,使用irq_desc結(jié)構來描述中斷:每個數(shù)組項對應一個中斷(也可能是一組中斷,它們使用共同的中斷號),里面記錄了中斷的名稱,中斷狀態(tài),中斷標記,并提供硬件訪問函數(shù)(清除
7、,屏蔽,使能中斷),提供了這個中斷的處理函數(shù)的入口,通過它可以調(diào)用用戶注冊的中斷處理函數(shù)include/linux/irq.h{.........irq_flow_handler_t?handle_irq;???//當前的中斷處理函數(shù)入口struct?irq_chip?*chip;???????//底層的硬件訪問..........struct?irqaction?*action;?//用戶提供的中斷處理函數(shù)鏈表unsigned?int?status;?//IRQ狀態(tài)...........const?char?*name;?????
8、//中斷名稱}?____cacheline_internodealigned_in_smp;Handle_irq是這個或者這組中斷的處理函數(shù)入口.當中斷發(fā)生時總中斷入口函數(shù)asm_do_IRQ將根據(jù)中斷號調(diào)用相應irq_desc數(shù)組中