Linux 中斷相關(guān)節(jié)點
/proc/interrupts
cat 這個節(jié)點,會打印系統(tǒng)中所有的中斷信息,如果是多核CPU,每個核都會打印出來。
包括每個中斷的名字、中斷號 IRQ number、每個中斷的觸發(fā)次數(shù)、在哪個CPU核處理的、是邊沿觸發(fā)還是電平觸發(fā),屬于哪個中斷控制器,都會打印出來。
/proc/irq/…
進入這個目錄。會看到以中斷號命名的文件夾,每個中斷號文件夾下面都有幾個節(jié)點,存儲了這個中斷的信息,比如smp_affinity、affinity_hint、spurious等。smp_affinity代表中斷號核CPU之間的親緣綁定關(guān)系,也就是如果某個中斷號綁定了一個CPU核,那么這個中斷就會一直在這個CPU上處理。
如何讓某個中斷在某個特定的 CPU 處理?
kernel 2.4 以后的版本才支持把不同的硬件中斷請求(IRQs)分配到特定的 CPU 上,這個綁定技術(shù)被稱為 SMP IRQ Affinity.更多介紹請參看 Linux 內(nèi)核源代碼自帶的文檔:linux-4.14/Documentation/IRQ-affinity.txt
/proc/irq/{IRQ}/smp_affinity
/proc/irq/{IRQ}/smp_affinity_list
/proc/irq/{IRQ}/smp_affinity 指定給定的 irq中斷號源允許哪些CPU執(zhí)行,它是一個掩碼位,比如是ff,代表11111111,表示這個中奪冠可以在 8 個 CPU 執(zhí)行,具體在哪一個 CPU執(zhí)行,靠分配器分配。
如果這個 /proc/irq/{IRQ}/smp_affinity 指定為00000001,代表這個IRQ只能在最后一個CPU核進行處理,其他CPU不允許處理,大家可以測試一下,主測試是 OK的(GIC支持,其他中斷控制器不一定)。
串口手動賦值的重啟以后會消失,可以在代碼中調(diào)用 irq_set_affinity 函數(shù),指定中斷的掩碼,來達到某個中斷被固定CPU處理的需求。
中斷分發(fā)機制
對于 GIC-V2 而言,SPI 的分發(fā)是根據(jù) Distributor 中的 Interrupt Processor Targets Registers 來決定的。對于任何一個 SPI,其都有在某個 GICD_ITARGETSRn 寄存器中有 8 個bit標識送達的processor,如果只有一個 bit 被 set,那么就很簡單了,如果該中斷是當前優(yōu)先級最高的中斷,那么 Distributor 就會送到對應的 CPU interface,該中斷最終會送達指定的 CPU。
如果該中斷對應的 Interrupt Processor Targets Registers 中的那 8 個 bit 有多個 bit 被 set
的話,Distributor 如何處理呢?“依次輪著把產(chǎn)生的中斷給各個CPU,還是說看哪個CPU有空就給哪個CPU來著”,讓硬件處理這么復雜的邏輯有些不合適,實際上,GIC的硬件是不會進行任何判斷的,也不會集成任何的算法,它就是根據(jù)Interrupt Processor Targets Registers的bit設定情況,忠實的把中斷送往指定的一個processor或者多個processors。
大家可以去看看 gic_set_affinity 這個函數(shù),這個函數(shù)確保一個中斷的 Interrupt Processor Targets
Registers 中的那8個bit只有一個bit被設定。
/kernel5.15/drivers/irqchip/irq-gic-v3.c
在 1244 和 1246 行,1246 行就是在 online 的 CPU 中選中一個,1263 行寫入到寄存器中,GIC 會讀取這個寄存器,是哪個 CPU,然后將中斷發(fā)給這個CPU。中間的函數(shù)很簡單,大家可以自己看。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1360瀏覽量
40185 -
cpu
+關(guān)注
關(guān)注
68文章
10804瀏覽量
210839 -
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208721 -
子系統(tǒng)
+關(guān)注
關(guān)注
0文章
109瀏覽量
12373
發(fā)布評論請先 登錄
相關(guān)推薦
評論