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