Linux版本:v6.0
處理器架構:ARMv8
這篇接續Linux中斷子系統簡介(1): 中斷處理流程的建立
前言
距離前篇已經過了快要半年… 中間跑去研究其他的事了所以才一直留著這個坑沒填,現在回來看已經有點生疏了qaq,果然有想寫的東西就要趕快啊
上次說明了Linux中斷處理的基本架構,還有初始化程式做的準備,包括設定handle_arch_irq
,irq_desc→handle_irq
,irqaction→handler
這幾個中斷處理函式。這次就來看一下他們在真的中斷來臨的時候如何被呼叫到的吧。
中斷處理流程執行
一個CPU在接收另一個CPU傳來的的IPI時,PC會跳到exception vector的IRQ vector執行:
1 | // arch/arm64/kernel/entry.S |
kernel_ventry
是一個assembly macro:
1 | .macro kernel_ventry, el:req, ht:req, regsize:req, label:req |
可以看到最後就是一個branch指令,假設原本CPU處於AArch64 EL0,
b el\el\ht\()_\regsize\()_\label
就會展開成
b el0t_64_irq
el0t_64_irq
被定義在同個檔案中,也是用一些macro生成的:
1 | // arch/arm64/kernel/entry.S |
我們要看的是entry_handler 0, t, 64, irq
,展開後會是
1 | SYM_CODE_START_LOCAL(el0t_64_irq) |
繼續(請看註解):
1 | // arch/arm64/kernel/entry-common.c |
那來看gic_handle_irq
:
1 | static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) |
連結到上一篇,desc→handle_irq
指向handle_percpu_devid_irq
1 | /** |
就是這樣啦~ EZPZ, right?