漫画-Linux中断子系统综述
1、中斷引發(fā)的面試教訓
2、什么是中斷?
中斷:?(英語:Interrupt)指當出現(xiàn)需要時,CPU暫時停止當前程序的執(zhí)行轉而執(zhí)行處理新情況的程序和執(zhí)行過程。
即在程序運行過程中,系統(tǒng)出現(xiàn)了一個必須由CPU立即處理的情況,此時,CPU暫時中止程序的執(zhí)行轉而處理這個新的情況的過程就叫做中斷。
中斷?在嵌入式軟件中幾乎不能離開它,你看到的幾乎所有的芯片都有中斷功能,不管是裸機程序STC89C51還是嵌入式Linux系統(tǒng),還是其他的RTOS系統(tǒng)都有中斷。每個外接設備申請一個唯一的中斷號,讓外設發(fā)生中斷時,向CPU報告自己的中斷號,CPU知道是哪個設備發(fā)生中斷,然后執(zhí)行相對應的操作。
3、為什么要用中斷?
4、Linux中斷子系統(tǒng)
4.1、中斷系統(tǒng)相關硬件描述
4.1.1、多個Interrupt controller和多個cpu之間的拓撲結構
第一種,就是有一個Root GIC(Generic Interrupt Controller)連接多個CPU,然后second GIC 接在 Root GIC上,Sencond GIC只負責上報中斷信息給Root GIC,Root GIC負責接收Second GIC中斷信息然后給CPU匯報中斷信息。
第二種就是Root GIC 負責給cpu0-cpu4匯報工作,Second GIC負責給cpu3-cpu7匯報工作。這樣設計的弊端就是Second GIC上的中斷信號不能傳給Cpu0-Cpu3,這樣的設計理論上不是很完美。
4.1.2、Interrupt controller把中斷事件送給哪個CPU?
在 SMP 體系結構中(cpu三大架構 numa smp mpp 之一),我們可以通過調(diào)用系統(tǒng)調(diào)用和一組相關的宏來設置 CPU 親和力(CPU affinity),將一個或多個進程綁定到一個或多個處理器上運行。
中斷在這方面也毫不示弱,也具有相同的特性。中斷親和力是指將一個或多個中斷源綁定到特定的 CPU 上運行。中斷親和力最初由?Ingo Molnar?設計并實現(xiàn)。
在 /proc/irq 目錄中,對于已經(jīng)注冊中斷處理程序的硬件設備,都會在該目錄下存在一個以該中斷號命名的目錄?IRQ#?,IRQ#?目錄下有一個?smp_affinity?文件(SMP 體系結構才有該文件),它是一個 CPU 的位掩碼,可以用來設置該中斷的親和力, 默認值為 0xffffffff,表明把中斷發(fā)送到所有的 CPU 上去處理。如果中斷控制器不支持 IRQ affinity,不能改變此默認值,同時也不能關閉所有的 CPU 位掩碼,即不能設置成 0x0。
舉個栗子
我們以網(wǎng)卡(eth1,中斷號 44 )為例,在具有 8 個 CPU 的服務器上來設置網(wǎng)卡中斷的親和力(以下數(shù)據(jù)出自內(nèi)核源碼 Documentation\IRQ-affinity.txt):
ffffffff
[]
[]
0000000f
[]
PING?hell?(195.4.7.3):?56?data?bytes
...
---?hell?ping?statistics?---
6029?packets?transmitted,?6027?packets?received,?0%?packet?loss
round-trip?min/avg/max?=?0.1/0.1/0.4?ms
[]
?44:???0???1785???1785???1783???1783???1???1???0???IO-APIC-level???eth1
[]
[]
PING?hell?(195.4.7.3):?56?data?bytes
..
---?hell?ping?statistics?---
2779?packets?transmitted,?2777?packets?received,?0%?packet?loss
round-trip?min/avg/max?=?0.1/0.5/585.4?ms
[]
?44:??1068??1785??1785??1784???1784???1069???1070???1069???IO-APIC-level??eth1
[]
在上例中,我們首先只允許在 CPU0-3 上處理網(wǎng)卡中斷,接著運行 ping 程序,不難發(fā)現(xiàn)在 CPU4-7 上并沒有對網(wǎng)卡中斷進行處理。然后只在 CPU4-7 上對網(wǎng)卡中斷進行處理, CPU0-3 不對網(wǎng)卡中斷進行任何處理,運行 ping 程序之后,再次查看?/proc/interrupts?文件時,不難發(fā)現(xiàn) CPU4~7 上的中斷次數(shù)明顯增加,而 CPU0~3 上的中斷次數(shù)沒有太大的變化。
4.2、中斷子系統(tǒng)相關的軟件框架
4.2.1、中斷上半部分和下半部分
中斷處理程序的這兩個目標相互沖突:
快點執(zhí)行
執(zhí)行大量工作
由于這些競爭目標,中斷的處理分為兩部分或一半:
上半部分。中斷處理程序是上半部分。上半部分在收到中斷后立即運行,僅執(zhí)行對時間要求嚴格的工作,例如確認收到中斷或重置硬件。
下半部分??梢栽谝院髨?zhí)行的工作推遲到下半部分。下半部分將在更方便的時間運行,并啟用所有中斷。
4.2.2、中斷分類
中斷如果分為兩大類,那就是同步中斷和異步中斷,如果根據(jù)中斷原因來分,可以分為四種。具體如下圖
4.2.3、中斷上下文
執(zhí)行中斷處理程序時,內(nèi)核處于中斷上下文中。
與進程上下文的區(qū)別:
進程上下文是內(nèi)核在代表進程執(zhí)行時所處的操作模式,例如執(zhí)行系統(tǒng)調(diào)用或運行內(nèi)核線程。
在進程上下文中,current宏(在內(nèi)核中,可以通過current宏來獲得當前執(zhí)行進程的task_struct指針)指向關聯(lián)的任務。
由于進程在進程上下文中耦合到內(nèi)核,因此進程上下文可以休眠或以其他方式調(diào)用調(diào)度程序。
current宏在發(fā)生中斷的時候,它指向中斷的進程。
沒有后備進程,中斷上下文無法休眠,無法重新安排。因此,您無法從中斷上下文中調(diào)用某些函數(shù)。如果函數(shù)休眠,則不能從中斷處理程序中使用它:這限制了可以從中斷處理程序調(diào)用的函數(shù)。中斷上下文是時間關鍵的,因為中斷處理程序會中斷其他代碼。
應該記住,中斷處理程序已經(jīng)中斷了其他代碼(可能甚至是另一行上的另一個中斷處理程序)。由于異步性質,所有中斷處理程序必須盡可能快速和簡單。應盡可能地將工作從中斷處理程序中推出,并在下半部分執(zhí)行,后者在更方便的時間運行。
4.2.4、linux kernel的中斷子系統(tǒng)
架構圖如下所示:
由上面的block圖,我們可知linux kernel的中斷子系統(tǒng)分成4個部分:
硬件無關的代碼,我們稱之Linux kernel通用中斷處理模塊。無論是哪種CPU,哪種controller,其中斷處理的過程都有一些相同的內(nèi)容,這些相同的內(nèi)容被抽象出來,和HW無關。此外,各個外設的驅動代碼中,也希望能用一個統(tǒng)一的接口實現(xiàn)irq相關的管理(不和具體的中斷硬件系統(tǒng)以及CPU體系結構相關)這些“通用”的代碼組成了linux kernel interrupt subsystem的核心部分。
CPU architecture相關的中斷處理。 和系統(tǒng)使用的具體的CPU architecture相關。
Interrupt controller驅動代碼 。和系統(tǒng)使用的Interrupt controller相關。
普通外設的驅動。這些驅動將使用Linux kernel通用中斷處理模塊的API來實現(xiàn)自己的驅動邏輯。
4.2.5、中斷調(diào)試
用示波器查看硬件是否真實產(chǎn)生了中斷
cat /proc/interrupts ?里面列舉了系統(tǒng)申請的所有中斷,查看自己注冊的中斷是否在里面
cat cat /proc/irq/[num]/ ?里面很多可以查看和調(diào)試的參數(shù)
4.2.6、Linux中斷是否可以嵌套嗎?
它的commit log清晰地解釋中斷嵌套可能引入的一些risk,比如stack溢出等。也就是說,從這個commit開始,實際Linux已經(jīng)不再支持中斷的嵌套, 也沒有快慢中斷的概念了,IRQF_DISABLED標記也作廢了。在IRQ HANDLER里面,無論一個中斷設置還是不設置IRQF_DISABLED, 內(nèi)核都不會開啟CPU對中斷的響應
具體查看鏈接:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e58aa3d2d0cc
5、參考
http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html/comment-page-2
https://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html
https://notes.shichao.io/lkd/ch7/#interrupt-control
推薦閱讀
pthread_mutex_lock 引發(fā)的血案
linux 內(nèi)核宏container_of剖析
這才是你想要桶排序
堆和棧的區(qū)別(轉過無數(shù)次的文章)
寫給過得很辛苦很迷茫的你~一定要看啊
當你看到這里的時候,說明你已經(jīng)閱讀完上面的內(nèi)容
不管怎樣,感謝您有心或者無意的關注和支持
公眾號接入了AI功能,回復任意消息(比如笑話,天氣)
覺得不錯,請幫忙轉發(fā),點好看,您的每一次支持,我都將銘記于心
想獲取學習資料,請點擊狀態(tài)欄公眾號福利按鈕
總結
以上是生活随笔為你收集整理的漫画-Linux中断子系统综述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android studio JNI j
- 下一篇: Linux 内核宏 time_after