不考慮el2和el3,irq處理分兩種情況:使用者態發生的中斷和核心態發生的中斷,相應的中斷處理介面分別為:
el1_irq
el0_irq
以核心態el1發生的irq為例:
358 .align 6
359 el1_irq:
360 kernel_entry 1
//壓棧,儲存上下文;
361 enable_dbg
362#ifdef config_trace_irqflags
363 bl trace_hardirqs_off
364#endif
365366 irq_handler /*呼叫中斷處理預設函式*/
367368
#ifdef config_preempt
369 get_thread_info tsk
370 ldr w24, [tsk, #ti_preempt] // get preempt count
371 cbnz w24, 1f
// preempt count != 0
372 ldr x0, [tsk, #ti_flags] // get flags
373 tbz x0, #tif_need_resched, 1f // needs rescheduling?
374 bl el1_preempt
3751:
376#endif
377#ifdef config_trace_irqflags
378 bl trace_hardirqs_on
379#endif
380 kernel_exit 1
381 endproc(el1_irq)
irq_handler也是乙個偽指令巨集操作:
187
/* 188 * interrupt handling.
189 */
190 .macro irq_handler
191 adrp x1, handle_arch_irq //把handle_arch_irq位址放到x1, handle_arch_irq是乙個指標;
192 ldr x1, [x1, #:lo12:handle_arch_irq]//取出指標所指向的值;
193 mov x0, sp
194 blr x1 //跳轉到handle_arch_irq
195 .endm
handle_arch_irq 在arch/arm64/kernel/irq.c設定:
45 void __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
46
根據不同的中斷控制器會設定不同的處理介面,通過在驅動控制器設定,**在drivers/irqchip/,以irq-gic.c(通用中斷控制器)為例,設定set_handle_irq(gic_handle_irq):
437 static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
438
452if (irqnr < 16)
460break;
461 } while (1);
462 }
DA9034中斷處理
clear the irq pdata ack irq schedule work pdata work return irq handled static void micco worker struct work struct work if val micco eb otgcp iover r...
Linux驅動開發 8 中斷分層機制 軟中斷
1 概念 軟中斷是模擬硬體中斷的概念,實現巨集觀上的非同步執行效果。其實tasklet 也是基於軟中斷實現的。2 軟中斷和硬中斷的區別 a 硬中斷是外部裝置對cpu 的中斷,軟中斷時程式對核心的中斷 b 訊號是由核心 或者其他程序 對某個程序的軟中斷 3 結構表示 struct softirq ac...
linux2 6 32中斷處理流程
1 當發生中斷時,pc指標通過異常向量表跳轉到中斷入口函式asm do irq asm do irq是中斷的c語言總入口函式,它在 arch arm kernel irq.c中定義,宣告如下 asmlinkage void exception asm do irq unsigned int irq,...