Linux 中斷相關節點
/proc/interrupts
cat 這個節點,會打印系統中所有的中斷信息,如果是多核CPU,每個核都會打印出來。
包括每個中斷的名字、中斷號 IRQ number、每個中斷的觸發次數、在哪個CPU核處理的、是邊沿觸發還是電平觸發,屬于哪個中斷控制器,都會打印出來。
/proc/irq/…
進入這個目錄。會看到以中斷號命名的文件夾,每個中斷號文件夾下面都有幾個節點,存儲了這個中斷的信息,比如smp_affinity、affinity_hint、spurious等。smp_affinity代表中斷號核CPU之間的親緣綁定關系,也就是如果某個中斷號綁定了一個CPU核,那么這個中斷就會一直在這個CPU上處理。
如何讓某個中斷在某個特定的 CPU 處理?
kernel 2.4 以后的版本才支持把不同的硬件中斷請求(IRQs)分配到特定的 CPU 上,這個綁定技術被稱為 SMP IRQ Affinity.更多介紹請參看 Linux 內核源代碼自帶的文檔: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執行,它是一個掩碼位,比如是ff,代表11111111,表示這個中奪冠可以在 8 個 CPU 執行,具體在哪一個 CPU執行,靠分配器分配。
如果這個 /proc/irq/{IRQ}/smp_affinity 指定為00000001,代表這個IRQ只能在最后一個CPU核進行處理,其他CPU不允許處理,大家可以測試一下,主測試是 OK的(GIC支持,其他中斷控制器不一定)。
串口手動賦值的重啟以后會消失,可以在代碼中調用 irq_set_affinity 函數,指定中斷的掩碼,來達到某個中斷被固定CPU處理的需求。
中斷分發機制
對于 GIC-V2 而言,SPI 的分發是根據 Distributor 中的 Interrupt Processor Targets Registers 來決定的。對于任何一個 SPI,其都有在某個 GICD_ITARGETSRn 寄存器中有 8 個bit標識送達的processor,如果只有一個 bit 被 set,那么就很簡單了,如果該中斷是當前優先級最高的中斷,那么 Distributor 就會送到對應的 CPU interface,該中斷最終會送達指定的 CPU。
如果該中斷對應的 Interrupt Processor Targets Registers 中的那 8 個 bit 有多個 bit 被 set
的話,Distributor 如何處理呢?“依次輪著把產生的中斷給各個CPU,還是說看哪個CPU有空就給哪個CPU來著”,讓硬件處理這么復雜的邏輯有些不合適,實際上,GIC的硬件是不會進行任何判斷的,也不會集成任何的算法,它就是根據Interrupt Processor Targets Registers的bit設定情況,忠實的把中斷送往指定的一個processor或者多個processors。
大家可以去看看 gic_set_affinity 這個函數,這個函數確保一個中斷的 Interrupt Processor Targets
Registers 中的那8個bit只有一個bit被設定。
/kernel5.15/drivers/irqchip/irq-gic-v3.c
在 1244 和 1246 行,1246 行就是在 online 的 CPU 中選中一個,1263 行寫入到寄存器中,GIC 會讀取這個寄存器,是哪個 CPU,然后將中斷發給這個CPU。中間的函數很簡單,大家可以自己看。
-
內核
+關注
關注
3文章
1410瀏覽量
41117 -
cpu
+關注
關注
68文章
11038瀏覽量
216039 -
Linux
+關注
關注
87文章
11465瀏覽量
212819 -
子系統
+關注
關注
0文章
115瀏覽量
12677
發布評論請先 登錄
電源技巧#7:通過更好的去耦減少開關節點振鈴
開關節點的振鈴
方波波形開關節點概述
無線傳感器網絡的普通節點和網關節點怎么實現?
STM32系統時鐘配置操作的一些關節點
方波波形開關節點為什么受歡迎
如何使用RC緩沖電路去除開關節點諧波噪聲

評論