最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一篇帶你了解Linux內(nèi)核源碼分析--中斷處理

2022-03-25 15:11 作者:補給站Linux內(nèi)核  | 我要投稿

一、中斷向量及匯編指令

1、中斷向量

  • Intel x86系列機器共支持256種向量中斷,Intel用一個8位無符號整數(shù)叫做一個向量,因此也叫中斷向量。所有256種中斷可分為兩大類:異常和中斷,異常又稱為故障和陷阱;中斷又分為外部可屏蔽中斷和外部非屏蔽中斷,所有I/O設(shè)備產(chǎn)生的中斷請求均引起屏蔽中斷。

  • 非屏蔽中斷的向量和異常的向量是固定的,而屏蔽中斷的向量可以通過對中斷控制器的編程來改變。Linux對256個向量分配:從0-31的向量對應(yīng)于異常和非屏蔽中斷;從32-47的向量分配給屏蔽中斷(即I/O設(shè)備引起中斷);從48-255向量用來標識軟中斷。Linux只用其中一個用來實現(xiàn)系統(tǒng)調(diào)用(128或0x80向量)。當用戶態(tài)下的進程執(zhí)行一條int 0x80匯編指令,CPU就切換到內(nèi)核態(tài),并開始執(zhí)行system_call()內(nèi)核函數(shù)。

2、外設(shè)可屏蔽中斷

  • Intel x86通過兩片中斷控制器8258A來響應(yīng)16個外中斷源,每個8259A可管理 8個中斷源。第1級(稱主片)的第2個中斷請求輸入端,與第2個9258A(稱從片)的中斷輸出端INT相連,級連8259A中斷機構(gòu)架構(gòu)如下:


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)??

中斷控制器執(zhí)行操作:

  1. 監(jiān)視中斷線,檢查產(chǎn)生的中斷請求(IRQ)信號;

  2. 如果在中斷線上產(chǎn)生了一個中斷請求信號:

  3. 把接受到的IRQ信號轉(zhuǎn)換成一個對應(yīng)的向量;

  4. 把這個向量存放在中斷控制器的一個I/O端口,從而允許CPU通過數(shù)據(jù)總結(jié)讀這個向量;

  5. 把產(chǎn)生的信號發(fā)送到CPU的INTR管腳----即發(fā)出一個中斷;

  6. 等待,直到CPU確認這個中斷信號,然后把它寫進可編程中斷控制器PIC的一個I/O端口,清INTR線。

  7. 返回到第一次。

  • 異常就是CPU內(nèi)部出現(xiàn)的中斷,也就是說,在CPU執(zhí)行特定指令時出現(xiàn)的非法情況。非屏蔽中斷就是計算機內(nèi)部硬件出錯時引起異常情況。

  • 表示門描述符的類型:任務(wù)門(101)、中斷門(110)、陷阱門(111)、系統(tǒng)門(用來讓用戶態(tài)的進程訪問intel陷阱門)

3、匯編指令

  1. 調(diào)用過程指令CALL(指令格式:CALL 過程名)

  2. 調(diào)用中斷過程指令 INT(指令格式:INT 中斷向量)

  3. 調(diào)用溢出處理程序的指令I(lǐng)NTO(指令格式:INTO)

  4. 中斷返回指令(指令格式:IRET------>與中斷調(diào)用過程相反EIP CS EFLAGS寄存器內(nèi)核從棧中彈出)

  5. 加載中斷描述符表的指令LIDT(指令格式:LIDT 48位的偽描述符)



二、異常處理與中斷處理

  • Linux利用異常來達到兩個不同目的:給進程發(fā)送一個信號以通報一個反常情況;處理請求分布。內(nèi)核對異常處理程序調(diào)用有一個標標準,由3個部分組成:在內(nèi)核棧中保存大多數(shù)寄存器的內(nèi)容(由匯編語言進行實現(xiàn));調(diào)用C語言編寫的異常處理函數(shù);通過ret_from_exception()函數(shù)從異常退出。

1、內(nèi)核棧保存寄存器值

  • 所有異常處理程序被調(diào)用的方式比較相似,我們用handler_name來表示一個通用的異常處理程序的名稱。進入異常處理程序的匯編指令,內(nèi)核源碼分析:



  • 標號為jmp error_code的匯編語言片段對所有的異常處理程序都相同的。



  • 進入異常處理程序時內(nèi)核堆棧結(jié)構(gòu)圖如下



2、中斷請求隊列機制 (中斷請求隊列的初始化)

  • Linux設(shè)計架構(gòu)的時候,專門為每個中斷請求IRQ設(shè)置一個完整隊列,我們可以把它稱為中斷請求隊列。中斷線、中斷請求號(IRQ)及中斷向量之間的關(guān)系:中斷線是中斷請求的一個物理描述,邏輯上對應(yīng)一個中斷請求號(中斷號),第x個中斷號(IRQx)的缺省中斷向量為x+32。

  • 在256個中斷向量中,除32個分配給異常以外,還有244個作為中斷向量。對于每個IRQ,Linux都有用一個irq_desc_t數(shù)據(jù)結(jié)構(gòu)來描述。如下對應(yīng)內(nèi)核源碼:



三、后半部分機制及數(shù)據(jù)結(jié)構(gòu)

1、為什么把中斷分為兩部分處理

  • 內(nèi)核把中斷分成兩個部分:前半部分和后半部分,前半部分內(nèi)核立即執(zhí)行,而后半部分稍后處理。中斷分割如下圖所示:



  • 首先,一個快速的"前半部分"來處理硬件發(fā)出的請求,它必須在一個新的中斷產(chǎn)生之前終止。:后半部分:來運行:允許一個普通的內(nèi)核函數(shù),而不僅僅是服務(wù)于中斷的一個函數(shù),能以后半部分的身份來運行;允許幾個普通的內(nèi)核函數(shù)合在一塊作為一個后半部分來運行。后半部分運行時是允許中斷請求,而前半部分運行時是關(guān)中斷的。

  • Linux內(nèi)核為將中斷服務(wù)分為兩部分提供方便,并設(shè)立相應(yīng)的機制。新版本內(nèi)核叫軟中斷機制(softirq) 。

四.軟中斷/tasklet/后半部分執(zhí)行

  • 軟中斷機制也是推遲內(nèi)核函數(shù)的執(zhí)行。tasklet建立在軟中斷之上,同一個tasklet只能運行在一個CPU上,而不同的tasklet可以同時運行在不同的CPU上。

  • 軟中斷處理機制之前,數(shù)據(jù)結(jié)構(gòu)在內(nèi)核源碼展現(xiàn),軟中斷本身是一種機制,同時也是一種基本框架。此框架包含bh機制,也包含tasklet機制,具體內(nèi)核定義的軟件中斷源碼如下:



  • 其中NET_TX_SOFTIRQ和NET_RX_SOFTIRQ兩個軟中斷是專為網(wǎng)絡(luò)操作而設(shè)計的,而HI_SOFTIRQ和TASKLET_SOFTIRQ是針對bh和tasklet而設(shè)計的軟中斷。

1.軟中斷向量:



2.軟中斷控制/狀態(tài)結(jié)構(gòu)

  • softirq_vec[]是一個全局量,系統(tǒng)中每個CPU所看到的是同一個數(shù)組,但是,每個CPU各有自己的”軟中斷控制狀態(tài)”結(jié)構(gòu)。irq_stat[]數(shù)組是一個全局量,但是各個CPU可以按自身的編號訪問相應(yīng)的域,內(nèi)核源碼如下:




一篇帶你了解Linux內(nèi)核源碼分析--中斷處理的評論 (共 條)

分享到微博請遵守國家法律
南岸区| 宣恩县| 高密市| 温宿县| 彭水| 剑川县| 津南区| 邯郸市| 祁连县| 荥阳市| 黄浦区| 佛山市| 天台县| 昭苏县| 正阳县| 平阳县| 永兴县| 集贤县| 禄丰县| 明星| 汝南县| 临桂县| 临西县| 津市市| 巨鹿县| 安乡县| 湘潭县| 彭阳县| 慈溪市| 蕉岭县| 河北省| 乌鲁木齐县| 赤城县| 扎赉特旗| 德格县| 鄱阳县| 桃源县| 泰来县| 永济市| 宁波市| 射阳县|