350 likes | 555 Views
中斷向量. 中斷的程式範例. 中斷簡介 (1). 中斷被定義為會暫停目前指令的執行而跳到特定程式去執行的事件 中斷大致可分為 4 類 外部中斷 例外中斷 陷阱中斷 軟體中斷. 中斷簡介 (2). Intel 的文件中有另一種中斷的定義。 CPU 會將暫停目前指令而跳到特定程式去執行的事件分為中斷與例外 中斷 可遮罩中斷 不可遮罩中斷 例外 失敗 陷阱 中止 程式例外. 中斷描述表. 中斷描述表是一種系統表格,主要目的是將每一個中斷或例外的向量對應至適當的中斷或例外處理器 IDT 包含三種描述器型態 任務閘門 中斷閘門
E N D
中斷的程式範例 2
中斷簡介 (1) • 中斷被定義為會暫停目前指令的執行而跳到特定程式去執行的事件 • 中斷大致可分為 4 類 • 外部中斷 • 例外中斷 • 陷阱中斷 • 軟體中斷 3
中斷簡介 (2) • Intel 的文件中有另一種中斷的定義。CPU 會將暫停目前指令而跳到特定程式去執行的事件分為中斷與例外 • 中斷 • 可遮罩中斷 • 不可遮罩中斷 • 例外 • 失敗 • 陷阱 • 中止 • 程式例外 4
中斷描述表 • 中斷描述表是一種系統表格,主要目的是將每一個中斷或例外的向量對應至適當的中斷或例外處理器 • IDT 包含三種描述器型態 • 任務閘門 • 中斷閘門 • 陷阱閘門 5
63 48 47 44 40 32 任務閘門描述器 31 16 0 63 48 47 44 40 37 32 中斷閘門描述器 位移(16-31) P DPL 0 1 1 1 0 0 0 0 保留 保留 P DPL 0 0 1 1 0 保留 分段選擇器 位移(0-15) 31 16 0 63 48 47 44 40 37 32 陷阱閘門描述器 TSS分段選擇器 保留 位移(16-31) P DPL 0 1 1 1 1 000 保留 分段選擇器 位移(0-15) 31 16 0 閘門描述器的格式 6
例外處理 • Linux 利用例外來達成兩個不同的目的 • 傳送信號給行程告知有異常狀況發生 • 處理需求分頁 • Linux 例外處理器的執行流程,可分為三個步驟: • 在核心的堆疊內儲存大部分暫存器的內容,這個部分的程式碼是由組合語言所撰寫 • 利用高階語言 C 函式處理例外 • 藉由 ret_from_exception() 函式離開例外處理器 7
中斷處理 • 為了使中斷處理器快速地完成,Linux 將中斷割成兩半 • 頂半部:具急迫性的動作 • 底半部:不急迫的動作 • 中斷處理器要執行的四個基本動作 • 將 IRQ 的值和暫存器的內容放在核心的堆疊內 • 通知中斷控制器該 IRQ 已經處理完成,可以繼續服務其他中斷 • 執行所有共享此 IRQ 的中斷服務常式 • 最後跳至 ret_from_intr() 的位址終止執行 8
INT INT 8259A Slave 8259A Master 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 IRQ IRO 串列連結兩個 8259A 9
硬體 軟體 (中斷處理) IDT[32+n] INT IRQn_interrupt() PIC do_IRQ(n) 中斷處理常式1 中斷處理常式2 中斷處理 10
第十六章 系統服務常式 • 中斷簡介 • 軟體中斷 • 底半部 • Softirq • Tasklet • 系統呼叫 • 裝置驅動程式 • 摘要 11
軟體中斷 • 底半部的作用是將較不急迫的動作延後處理以縮短中斷延遲 • 底半部的設計是不可重複進入的,因此底半部強烈要求序列化 • Softirq 如同 Linux 2.2 中的底半部,不過它是可重複進入的,甚至兩個處理器可以同時執行相同的 softirq • 在 Linux 2.4 也有一個類似底半部的機制稱為 tasklet • Tasklet 架構在 softirq 之上,不過它們要求本身序列化 12
底半部 • 底半部是一個低優先權的函式用來處理中斷 • 所有的底半部皆被事先定義在核心裏,而且最多只有 32 個 • 核心會在適當時機執行底半部的工作 • 核心完成一個系統呼叫 • 核心完成一個例外處理 • 核心終止 do_IRQ() 函式(即完成中斷處理) • 核心執行 schedule() 函式選擇新的行程給 CPU 執行 13
ret_from_intr: 巢狀的核心控制路徑? GET_CURRENT 是 ret_from_exception: 否 ret_from_sys_call: 須要 重新排程? 是 重新排程 schedule() 是 否 signal_return: 訊號未處理? v86保護模式? 是 v86_signal_return: 否 否 save_v86_state() do_signal() restore_all 從中斷或例外處理返回 14
Softirq • Softirq 與底半部都是將中斷處理的一部分動作延遲到後面執行 • softirq 的設計使得 SMP 的系統能夠更有彈性地去處理中斷 • 核心內每1個 CPU 可以禁止、啟動、執行不同的 softirq 副本,並且有規律地輪詢 softirqs 的旗標 15
softirq_pending[NR_CPU] • softirq_vec[32] 遮罩位元 00001101 處理器0和資料0 tasklet 處理器 softirq向量表和旗標 16
Tasklet • Tasklet 與 softirqs 主要的不同點在於 tasklet 是可以被動態註冊的 • 同一個 tasklet 不能夠同時執行於多個 CPU 17
tasklet_vec[cpu].list NULL list tasklet tasklet tasklet NULL tasklet串列 18
第十六章 系統服務常式 • 中斷簡介 • 軟體中斷 • 系統呼叫 • 執行系統呼叫 • 參數傳遞 • 封裝常式 • 裝置驅動程式 • 摘要 19
系統呼叫 • 讓使用者模式下的行程能夠使用磁碟、印表機等硬體裝置,作業系統提供了一組介面稱為系統呼叫 • 提供介於應用程式與硬體間的介面的好處 • 它使得程式設計更為容易 • 增加系統的安全性 • 介面讓程式能夠獲得更佳的可攜性 20
執行系統呼叫 • 使用者行程執行系統呼叫時,CPU 會切換至核心模式,並開始執行核心函式 • 為了將不同的系統呼叫號碼對應至適當的系統呼叫服務常式,Linux 核心中使用了一個系統呼叫分派表 21
核心模式 使用者模式 system_call: … sys_xyz() … ret_from_sys_call: … iret … xyz() … xyz() { … int 0x80 … } sys_xyz() { … } 應用程式執行系統呼叫 在libc標準程式庫內的封裝常式 系統呼叫處理器 系統呼叫服務常式 執行一個系統呼叫 22
參數傳遞 • 呼叫系統呼叫時,通常需要傳遞參數給作業系統 • 在 Intel IA-32 的架構下,使用暫存器來傳遞參數有 2 個條件必須滿足 • 參數的長度不能超過暫存器大小 • 參數的個數不能超過 6 個 23
封裝常式 • 核心執行緒也能夠使用系統呼叫,只不過在核心內不能夠使用程式庫的函式,因此需要透過封裝常是來執行 • Linux 定義六個巨集來簡化封裝常式的宣告 24
實體記憶體位址 0xFFFFFFFF libc 函式庫 4 3 8 使用者 空間 2 清除堆疊 使用者 程式碼 Call write() 將 write() 所需參數放入堆疊 1 7 5 6 指派 系統呼叫服務常式 作業系統 空間 跳回使用者程式 system_call() sys_call_table 0 Int 0x80 將系統呼叫號碼放在暫存器中 系統呼叫流程圖 25
第十六章 系統服務常式 • 中斷簡介 • 軟體中斷 • 系統呼叫 • 裝置驅動程式 • 字元與區塊裝置 • 核心程式環境 • 撰寫裝置驅動程式 • 摘要 26
裝置驅動程式 • 裝置驅動程式是核心之中,由一些函式與資料所組成的 I/O 裝置的軟體介面 • 裝置驅動程式可以被多個使用者的應用程式所同時共享 • Linux 裝置驅動程式有以下幾點特徵 • 包含可以與硬體裝置溝通的常式,並提供作業系統統一的使用介面 • 裝置驅動程式是一個自訂的元件,可以動態地從作業系統中加入或移除 • 可以管理並控制在使用者程式與週邊裝置之間的資料傳遞 • 包含一段使用者所定義的核心,可以讓程式或是週邊裝置以 "/dev" 目錄下的檔案形式供其他行程使用 27
使用者行程 /dev/dev_file 使用者空間 核心空間 裝置驅動程式 硬體裝置 裝置驅動程式與系統關係圖 28
字元與區塊裝置 • 字元和區塊裝置是 Linux 中兩種最主要的裝置類別 • 字元裝置與檔案相似,利用位元組串流方式存取資料 • 區塊裝置則可以使用檔案系統 29
核心程式環境 • 驅動程式必須是核心的一部分,才可以服務中斷與存取裝置硬體,並且要能夠有效率地處理中斷 • 多個行程同時共享裝置驅動程式中的中斷或是同步區段的資料時,資料就必須要使用臨界區以避免發生錯誤 • 在多 CPU 的系統中無法利用關閉中斷的方式來達到互斥,所以必須要利用旋轉鎖的方式來實作臨界區 30
撰寫裝置驅動程式 • 裝置驅動程式主要分為以下幾個部分 • 初始函式 • 註冊 IRQ 與中斷處理函式 • 裝置操作函式 • 離開函式 31
摘要 (1) • 中斷被定義為會暫停目前指令的執行而跳到特定程式去執行的事件 • 中斷大致可分為 • 外部中斷 • 例外中斷 • 陷阱中斷 • 軟體中斷 • 中斷描述表主要的目的是將每個中斷或例外的向量,對應到中斷或例外處理器的位址 32
摘要 (2) • IDT 包含3種描述器型態 • 任務閘門 • 中斷閘門 • 陷阱閘門 • Linux 的例外主要可達到兩種不同的目的 • 傳送信號給行程告知有異常狀況發生 • 處理需求分頁 • 軟體中斷在 Linux 2.4 上包含3種型式 • 底半部 • Softirq • tasklet 33
摘要 (3) • 系統呼叫是介於應用程式與硬體間的一個額外階層 • 程式撰寫容易 • 增加系統的安全性 • 是程式獲得更佳的可攜性 • 裝置的驅動程式主要分為四個部分 • 初始函式 • 註冊 IRQ 與中斷處理函式 • 裝置操作函式 • 離開函式 34