You are on page 1of 79

輸出入控制

作者 : 陳鍾誠
單位 : 金門技術學院資管系
Email: ccc@kmit.edu.tw
URL : http://ccc.kmit.edu.tw

日期 : 110/11/02
輸出入系統

2 陳鍾誠 - 110/11/02
單晶片控制

3 陳鍾誠 - 110/11/02
空轉程式
//****************** 基本動作範例程式 *************************
//* 檔名︰ DEMO.C
//* 功能︰令變數 i 遞加,及延時
//************************************************************
void Delay(unsigned int dly); // 宣告延時函數
unsigned int i=0; // 宣告變數

int main(void)
{
while(1) // 重覆執行
{
i++; // 變數遞加
Delay(9); // 延時
}
return(0);
}
//************************************************************
void Delay(unsigned int dly) // 延時函數
{
while(dly>0) dly--; // 空轉 dly 次
}
4 陳鍾誠 - 110/11/02
輸出入的記憶體對映
– 以 ARM 微範例

; Phase Locked Loop (PLL)


PLLCON EQU 0xE01FC080
PLLCFG EQU 0xE01FC084
PLLSTAT EQU 0xE01FC088
PLLFEED EQU 0xE01FC08C

; Pin Connect Block


PINSEL0 EQU 0xE002C000
PINSEL1 EQU 0xE002C004

; General Purpose Input/Output (GPIO)


GPIO_BASE EQU 0xE0028000
IOPIN EQU 0xE0028000
IOSET EQU 0xE0028004
IODIR EQU 0xE0028008
IOCLR EQU 0xE002800C

; External Interrupts And Remap


EXTINT EQU 0xE01FC140
EXTWAKE EQU 0xE01FC144
MEMMAP EQU 0xE01FC040
… 5 陳鍾誠 - 110/11/02
ARM - LPC210x 的
//******* 檔名 :target.c ***************************************
//** 描述 :LPCx 目標板特殊的程式,包括異常處理程式和目標板初始化程式
//** 使用者須根據功能的需要,修改本程式。

簡單處理範例
//** 注意 : 本文件必須以 ARM(32-bit) 模式編譯,否則必須更改 init.s 及 vector.s
//** 其它 C 語言程式則不必使用 ARM 模式編譯
//**********************************************************
#define IN_TARGET
#include "config.h"
//**********************************************************
//** 功能 : 中斷異常處理程式,根據需要自行改變程式
//**********************************************************
void __irq IRQ_Exception(void) {
while(1); // 原地空轉,當機
}
//**********************************************************
//** 功能 : 快速中斷異常處理程式,根據需要自行改變程式
//**********************************************************
void FIQ_Exception(void) {
while(1); // 原地空轉,當機
}
//**************************************************************
//** 功能 : 進入 main 函數前,目標板初始化程式,若僅有軟體模擬可省略
//***************************************************************
void TargetResetInit(void) {}
//***************************************************************
//** 功能 : 目標板各項功能的初始化程式,根據需要增加
//***************************************************************
void TargetInit(void) {}
6 陳鍾誠 - 110/11/02
// LPC21000 實驗板接腳定義
#define SPI_CS 0x00000100 // P0.8
#define SPI_DATA 0x00000040 // P0.6
#define SPI_CLK 0x00000010 // P0.4

#define BEEP 0x00000080 // P0.7 為蜂鳴器控制

#define LED1 0x00000400 // P0.10


#define LED2 0x00000800 // P0.11
#define LED3 0x00001000 // P0.12
#define LED4 0x00002000 // P0.13

#define KEY1 0x00004000 // P0.14 (EINT1)


#define KEY2 0x00008000 // P0.15 (EINT2)
#define KEY3 0x00010000 // P0.16 (EINT0)
#define KEY4 0x00400000 // P0.22
#define KEY5 0x00800000 // P0.23
#define KEY6 0x01000000 // P0.24

7 陳鍾誠 - 110/11/02
第十四章 輸出/輸入系統
 I/O 硬體
 輪詢
 中斷
 直接記憶體存取
 應用系統 I/O 介面
 核心 I/O 子系統
 實作議題
 摘要
8 陳鍾誠 - 110/11/02
I/O 硬體
 現今的電腦系統有許多週邊裝置,如
 儲存裝置:磁碟、軟碟、光碟
 傳輸裝置:網路卡、數據機
 人機操作介面:螢幕、鍵盤、滑鼠
 PCI 匯流排將較快的裝置連接到處理器與記憶體等相關
子系統,如
 圖形顯示控制器
 記憶體控制器
 IDE 磁碟控制器
 延伸匯流排連接速度較慢的裝置,如
 鍵盤
 串列埠
 平行埠
9 陳鍾誠 - 110/11/02
典型的個人電腦匯流排結構
顯示器 中央處理器 匯 磁碟
快取 流
圖形顯示 橋接 / 記憶 排 磁碟
控制器 體 記憶體 SCSI 磁碟
控制器
控制器

PCI 匯流排
IDE 磁碟
控制器 延伸匯流排介面 鍵盤

磁碟 磁碟 延伸匯流排

磁碟 磁碟 平行埠 串列埠
10 陳鍾誠 - 110/11/02
輪詢
 主機一遍又一遍地讀取控制器狀態暫存器內的
值並處於忙碌等待狀態
 輪詢不適用於
 大量存取資料
 速度緩慢的控制器

11 陳鍾誠 - 110/11/02
輪詢的程式範例

12 陳鍾誠 - 110/11/02
中斷 (1)
 中斷是可以改變 CPU 待執行指令執行
順序的事件
 CPU 有個硬體機制稱為中斷要求線
 當有中斷發生, CPU 會停止目前執行的指
令並執行中斷處理常式
 中斷處理常式
 中斷發生後 CPU 處理中斷需求的程式
 中斷向量
 不同的中段需求利用中斷向量對應到不同的
中斷處理常式 陳鍾誠 - 110/11/02
13
中斷 (2)
 可遮罩與不可遮罩中斷
 可遮罩中斷,中斷訊號送至處理器的 INTR 腳位,它
們能夠藉由清除 eflags 暫存器上的 IF 旗標而被暫時
關閉
 不可遮罩中斷,訊號送至處理器的 NMI 腳位,無法
經由清除 IF 旗標將它們暫時關閉
 系統呼叫
 提供應用程式呼叫核心服務常式
 軟體中斷
 可由撰寫程式來觸發的中斷
 陷阱
 軟體觸發、事先設計好的中斷
14 陳鍾誠 - 110/11/02
中斷驅動 I/O 程序
CPU
步驟 1 :裝置驅動 I/O 控制
程式對 I/O 初始化 器
CPU 在指令 步驟 2 :初始化 I/O

執行中斷檢查
步驟 4 : CPU 接 步驟 3 :輸入就緒、輸
受中斷,將控制權 出完成、或發生錯誤,
轉移到中斷處理器 隨後產生中斷訊號

步驟 5 :中斷處理
器處理完資料,自
中斷返回

步驟 6 : CPU 繼
續執行被中斷的工
作 15 陳鍾誠 - 110/11/02
中斷的程式範例

16 陳鍾誠 - 110/11/02
直接記憶體存取
 避免可程式化 I/O 加重 CPU 的負擔,將記
憶體存取的工作交由直接記憶體存取控制器來
處理,此時 CPU 便可繼續其他非 I/O 的指

 直接記憶體存取的特性
 不透過 CPU ,一次存取大量資料
 減少中斷次數
 適用於高速 I/O 設備

17 陳鍾誠 - 110/11/02
DMA 傳輸步驟
處理器

快取
記憶體
DMA/ 匯流排 / 延伸匯流排
中斷控制器 X 緩衝區

PCI 匯流排

IDE 磁碟控制器

磁碟 磁碟

磁碟 磁碟

18 陳鍾誠 - 110/11/02
第十四章 輸出/輸入系統
 I/O 硬體
 應用系統 I/O 介面
 區塊和字元裝置
 網路裝置
 時脈與計時器
 阻隔與非組隔 I/O
 核心 I/O 子系統
 實作議題
 摘要
19 陳鍾誠 - 110/11/02
應用系統 I/O 介面
 裝置驅動器階層化
 目的是隱藏裝置間的差異,使 I/O 子系統能獨立
於硬體之外
 裝置存取方式分為 4 大類
 字元串流 I/O
 區塊 I/O
 記憶體對映檔案存取
 網路插口

20 陳鍾誠 - 110/11/02
核心 I/O 結構
核心

軟體 核心 I/O 子系統

… PCI 匯流 ATAPI
SCSI 裝置鍵盤裝置 滑鼠裝置 排裝置 軟碟裝置
裝置
驅動程式 驅動程式 驅動程式 驅動程式 驅動程式
驅動程式

… PCI 匯流
SCSI 裝置鍵盤裝置 滑鼠裝置 軟碟裝置 ATAPI
排裝置 裝置
控制器 控制器 控制器 控制器
控制器 控制器
硬體
… ATAPI
PCI
SCSI 裝 鍵盤 滑鼠 軟碟裝置 裝置(磁
匯流排
置 碟,磁
21 陳鍾誠 - 110/11/02
帶)
區塊和字元裝置
 區塊裝置介面泛指存取磁碟及其他區塊裝置的所有功

 應用程式將區塊裝置當作一個線性區塊陣列使用
 應用程式不需要知道裝置在低階處理時的差異
 讀取、寫入和搜尋是存取區塊裝置的基本操作
 字元串流的存取方式適合低速不定期的一連串字元 I
/O 應用,如
 滑鼠
 數據機
 鍵盤
(鍵盤的存取是典型字元串流介面的應用)
22 陳鍾誠 - 110/11/02
網路裝置
 網路插口介面在許多系統上被廣泛地使用
 網路插口介面使得應用程式能夠建立一個從插
口連接到遠端主機的伺服程式,並可經由插口
傳送與接收封包資料

23 陳鍾誠 - 110/11/02
時脈與計時器
 電腦的時脈與計時器提供 3 種基本功能:
 提供目前時間
 提供經過時間
 設定計時器在某時間觸發某動作
 可程式化硬體計時器能夠設定一段時間後產生
中斷

24 陳鍾誠 - 110/11/02
阻隔與非組隔 I/O
 阻隔式 I/O
 系統呼叫時,此應用程式會停止執行,從作業系統的
執行佇列被移到等待佇列;直到系統呼叫完成後,才
將應用程式從等待佇列再移回到執行佇列繼續執行
 非阻隔式 I/O
 在呼叫後立即回傳 I/O 處理的狀態,即使 I/O 尚未
完成也不等待
 多執行緒是另外一種達成 CPU 與 I/O 重疊執
行的方法

25 陳鍾誠 - 110/11/02
第十四章 輸出/輸入系統
 I/O 硬體
 應用系統 I/O 介面
 核心 I/O 子系統
 I/O 排程
 緩衝
 快取
 週邊並行和裝置預留
 錯誤處理
 核心資料結構
 實作議題
 摘要
26 陳鍾誠 - 110/11/02
核心 I/O 子系統
 核心提供許多 I/O 的服務,這些服務都是建
立在硬體與裝置驅動器的基礎之上,由核心的
I/O 子系統所提供

27 陳鍾誠 - 110/11/02
I/O 排程
 I/O 排程的目的是要找出一個好的 I/O 執行
順序來提昇系統的整體效率
 一般 I/O 排程的實作是讓每個裝置維護一個
要求佇列,當應用程式要求一個阻隔式 I/O 系
統呼叫時,這個要求就會被放置在指定裝置的
要求佇列中,再經由作業系統的 I/O 排程器重
新排定佇列內的執行順序

28 陳鍾誠 - 110/11/02
緩衝
 緩衝區是一個介於兩個裝置或是裝置與應用程
式間傳遞資料的記憶體區域
 使用緩衝區的 3 個理由
 讓不同速度的生產者與消費者間傳遞資料
 調整裝置間不同大小的資料傳輸
 I/O 的拷貝語意

29 陳鍾誠 - 110/11/02
裝置傳輸速率
gigaplane
匯流排
SBUS
SCSI 匯流排
高速乙太網路
硬碟
乙太網路
雷射印表機
數據機
滑鼠
鍵盤
0 10-2 10-1 1 10 102 103 104 105 106
Sun Enterprise 6000, 對數值
30 陳鍾誠 - 110/11/02
快取
 快取是先將資料複製到速度較快的記憶體中再
行存取的方法
 快取和緩衝是兩種不同的功能,不過有時兩者
可能會使用到同一塊記憶體

31 陳鍾誠 - 110/11/02
週邊並行和裝置預留
 週邊並行,是指利用緩衝區暫存週邊裝置資料
,使得不能夠多工處理的系統也能加強 CPU
與 I/O 的並行處理,以增進系統效能
 週邊並行是作業系統提供與協調並行輸出的方
法,有些作業系統則提供裝置的互斥存取,讓
行程以預留的方式配置及釋回裝置

32 陳鍾誠 - 110/11/02
錯誤處理
 使用保護模式的作業系統,能夠處理許多
硬體與應用程式的錯誤,使得系統不會因
為一點點的機械故障而造成整個系統無法
運作
 一般錯誤處理的做法是檢查 I/O 系統回傳
的狀態位元,也就是成功或失敗的訊息,
當該位元狀態顯示失敗時,再進行錯誤處
理程序

33 陳鍾誠 - 110/11/02
核心資料結構
 系統可以透過核心資料結構,來了解 I/O 元件
目前使用的狀況和其他的 I/O 活動
 I/O 子系統負責協調可供應用程式與核心使用的
服務,其主要負責的項目如下:
 檔案和裝置名稱空間的管理
 檔案和裝置的存取控制
 操作控制
 檔案系統空間配置
 裝置配置
 緩衝、快取、和週邊並行
 I/O 排程
 裝置狀態監控、錯誤處理、和失敗回復
 裝置驅動器的設置與初始化 34
陳鍾誠 - 110/11/02
UNIX I/O 核心結構
全系統開啟檔案表
使用中的
檔案系統記錄 inode 表
inode 指標
讀寫函式指標
每個行程的開
select 函式指標
檔案 啟檔案表
ioctl 函式指標
描述器 關閉函式指標

使用者行程記憶體
... 網路
網路插口記錄 資訊表
網路資訊指標
讀寫函式指標
select 函式指標
ioctl 函式指標
關閉函式指標

...
核心記憶體
35 陳鍾誠 - 110/11/02
第十四章 輸出/輸入系統
 I/O 硬體
 應用系統 I/O 介面
 核心 I/O 子系統
 實作議題
 操作轉換
 驅動器串流
 效率
 摘要
36 陳鍾誠 - 110/11/02
實作議題
 設計 I/O 系統時需要考慮的議題
 I/O 功能實作在硬體、裝置驅動器或是在應用程式
之中
 裝置驅動器與應用程式間的操作轉換
 I/O 的執行效率

37 陳鍾誠 - 110/11/02
操作轉換
 以磁碟讀取檔案來說,應用程式是透過檔案名
稱讀取檔案內的資料,而檔案系統則必須先查
詢檔案系統目錄中的檔案名稱,才能獲得檔案
的位置,進而提供資料給應用程式

38 陳鍾誠 - 110/11/02
I/O 要求的生命週期
1. 要求 I/O 使用者行程 10. I/O 完成,輸入資料
可用或輸出完成
系統呼叫
自系統呼叫返回
核心
2. 是否已經 I/O 子系統 9. 傳送資料(若適當)至
滿足要求 是 行程,返回完成或錯誤訊息

3. 對裝置驅動器發出要求 核心
,如果適當則阻隔行程 I/O 子系統

4. 處理要求,向控制器下命 8. 決定是哪個 I/O 完成,


裝置驅動器
令並設成阻隔直到中斷為止 對 I/O 子系統指出狀態改變

7. 接收中斷,如果是輸入
中斷處理器 則儲存資料於裝置驅動器
裝置控制器命令 內的緩衝區,並發出訊號
解除受阻隔的裝置驅動器

中斷
5. 監控裝置, 裝置控制器 6. I/O 完成,產生中斷
當 I/O 完成時發出中斷

時間 39 陳鍾誠 - 110/11/02
驅動器串流
 串流是在裝置驅動器和使用者行程之間全雙工
的連接管道
 串流是由串流頭、控制裝置的驅動器尾、和中
間零或多個成線性排列的串流模組所組成
 驅動器串流 I/O 是一種非同步的 I/O

40 陳鍾誠 - 110/11/02
驅動器串流結構
使用者應用程式
使用者空間
串流頭 核心空間

讀取佇列 寫入佇列

讀取佇列 寫入佇列
模組

讀取佇列 寫入佇列…

讀取佇列 寫入佇列
驅動程式尾
硬體介面
裝置
41 陳鍾誠 - 110/11/02
效率
 I/O 是影響系統效率的主因
 改進 I/O 的執行效率
 減少內文切換的次數
 減少資料複製到記憶體上的次數
 藉由大量傳輸、智慧型控制器與輪詢減少中斷的頻率
 增加使用 DMA 控制器的平行處理
 減少 CPU 對於簡單資料複製處理的次數
 將初始條件移到硬體上處理平衡 CPU 、記憶體子系
統、匯流排與 I/O 的執行效率

42 陳鍾誠 - 110/11/02
電腦通訊
鍵入 接收網
字元 系統呼叫 路封包
完成
硬體 內文切換 硬體

中斷產生 中斷處理 網路卡

狀態儲存 狀態儲存

中斷處理 中斷產生 中斷產生

網路 狀態儲存

裝置 網路卡 裝置
驅動程式 驅動程式

核心 裝置 核心 網路子
驅動程式 伺服精靈
內文切換 內文切換 內文切換
使用者 內文 核心 網路 內文 核心
行程 切換 伺服精靈 切換
傳送系統 43 接收系統 陳鍾誠 - 110/11/02
裝置功能進行階程

新演算法

增 增 增 增 應用程式碼
加 加 加 加
核心程式碼
開 效 發 抽 增
發 率 展 象 裝置驅動程式碼 加
時 成 化 裝置控制碼(硬 彈
間 本 體) 性
裝置碼(硬體)

44 陳鍾誠 - 110/11/02
摘要 (1)
 I/O 的基本元件
 匯流排
 裝置控制器
 裝置本身
 系統呼叫介面提供裝置服務給應用程式使用,包括
 區塊裝置
 字元裝置
 記憶體對映檔
 網路插口
 計時器
45 陳鍾誠 - 110/11/02
摘要 (2)
 核心 I/O 子系統提供數種服務
 I/O 排程
 緩衝
 週邊並行
 錯誤處理
 裝置保留
 實作議題
 操作轉換
 驅動器串流
 效率
46 陳鍾誠 - 110/11/02
中斷簡介 (1)
 中斷被定義為會暫停目前指令的執行而跳到特
定程式去執行的事件

 中斷大致可分為 4 類
 外部中斷
 例外中斷
 陷阱中斷
 軟體中斷

47 陳鍾誠 - 110/11/02
中斷簡介 (2)
 Intel 的文件中有另一種中斷的定義。 CP
U 會將暫停目前指令而跳到特定程式去
執行的事件分為中斷與例外
 中斷
 可遮罩中斷
 不可遮罩中斷
 例外
 失敗
 陷阱
 中止
 程式例外 48 陳鍾誠 - 110/11/02
中斷描述表
 中斷描述表是一種系統表格,主要目的是將每
一個中斷或例外的向量對應至適當的中斷或例
外處理器
 IDT 包含三種描述器型態
 任務閘門
 中斷閘門
 陷阱閘門

49 陳鍾誠 - 110/11/02
閘門描述器的格式
63 任務閘門描述器 48 47 44 40 32
保留
保留 P DPL 0 0 1 1 0 保留
保留
TSS
TSS分段選擇器
分段選擇器 保留
保留
31 16 0
63 中斷閘門描述器 48 47 44 40 37 32
位移(16-31
位移( 16-31)
) P DPL 0 1 1 1 0 0 0 0 保留
保留
分段選擇器
分段選擇器 位移(0-15
位移( 0-15)

31 16 0
63 陷阱閘門描述器 48 47 44 40 37 32
位移(16-31
位移( 16-31)
) P DPL 0 1 1 1 1 000 保留
保留
分段選擇器
分段選擇器 位移(0-15
位移( 0-15)

31 16 0
50 陳鍾誠 - 110/11/02
例外處理
 Linux 利用例外來達成兩個不同的目的
 傳送信號給行程告知有異常狀況發生
 處理需求分頁
 Linux 例外處理器的執行流程,可分為三個步
驟:
 在核心的堆疊內儲存大部分暫存器的內容,這個部
分的程式碼是由組合語言所撰寫
 利用高階語言 C 函式處理例外
 藉由 ret_from_exception() 函式離開例外處理器
51 陳鍾誠 - 110/11/02
中斷處理
 為了使中斷處理器快速地完成, Linux 將中斷割成兩

 頂半部:具急迫性的動作
 底半部:不急迫的動作
 中斷處理器要執行的四個基本動作
 將 IRQ 的值和暫存器的內容放在核心的堆疊內
 通知中斷控制器該 IRQ 已經處理完成,可以繼續服
務其他中斷
 執行所有共享此 IRQ 的中斷服務常式
 最後跳至 ret_from_intr() 的位址終止執行
52 陳鍾誠 - 110/11/02
串列連結兩個 8259A
INT INT

8259A Slave 8259A Master

8 9 10 11 12 13 14 15 01234567

IRO IRQ

53 陳鍾誠 - 110/11/02
中斷處理
硬體 軟體
(中斷處理)

IDT[32+n]
INT
PIC IRQn_interrupt
()
do_IRQ(n)

中斷處理常式 1 中斷處理常式
2

54 陳鍾誠 - 110/11/02
第十六章 系統服務常式
 中斷簡介
 軟體中斷
 底半部
 Softirq
 Tasklet
 系統呼叫
 裝置驅動程式
 摘要
55 陳鍾誠 - 110/11/02
軟體中斷
 底半部的作用是將較不急迫的動作延後處理以縮短中
斷延遲
 底半部的設計是不可重複進入的,因此底半部強烈要
求序列化
 Softirq 如同 Linux 2.2 中的底半部,不過它是可重
複進入的,甚至兩個處理器可以同時執行相同的 sof
tirq
 在 Linux 2.4 也有一個類似底半部的機制稱為 taskl
et
 Tasklet 架構在 softirq 之上,不過它們要求本身序
列化
56 陳鍾誠 - 110/11/02
底半部
 底半部是一個低優先權的函式用來處理中斷
 所有的底半部皆被事先定義在核心裏,而且最
多只有 32 個
 核心會在適當時機執行底半部的工作
 核心完成一個系統呼叫
 核心完成一個例外處理
 核心終止 do_IRQ() 函式 ( 即完成中斷處理 )
 核心執行 schedule() 函式選擇新的行程給 CPU
執行
57 陳鍾誠 - 110/11/02
從中斷或例外處理返回
ret_from_in
tr:
GET_CURRENT
是 巢狀的核
心控制路 ret_from_exception
徑? :

ret_from_sys_ca
ll:

須要 是 重新排程
schedule(
重新排程
)
?


signal_retur
n:
訊號未處 是
理? v86
保護模式
否 ? v86_signal_return:
否 save_v86_state(
)
do_signal
()
restore_all 58 陳鍾誠 - 110/11/02
Softirq
 Softirq 與底半部都是將中斷處理的一部分動
作延遲到後面執行
 softirq 的設計使得 SMP 的系統能夠更有彈
性地去處理中斷
 核心內每 1 個 CPU 可以禁止、啟動、執行
不同的 softirq 副本,並且有規律地輪詢 sof
tirqs 的旗標

59 陳鍾誠 - 110/11/02
softirq 向量表和旗標

softirq_pending[NR_CP
U]
00001101 遮罩位元

softirq_vec[32]

處理器 0 和資料 0
tasklet 處理器

60 陳鍾誠 - 110/11/02
Tasklet
 Tasklet 與 softirqs 主要的不同點在於 taskl
et 是可以被動態註冊的
 同一個 tasklet 不能夠同時執行於多個 CPU

61 陳鍾誠 - 110/11/02
tasklet 串列

tasklet_vec[cpu].list
NULL

list

tasklet tasklet tasklet NULL

62 陳鍾誠 - 110/11/02
第十六章 系統服務常式
 中斷簡介
 軟體中斷
 系統呼叫
 執行系統呼叫
 參數傳遞
 封裝常式
 裝置驅動程式
 摘要
63 陳鍾誠 - 110/11/02
系統呼叫
 讓使用者模式下的行程能夠使用磁碟、印表機
等硬體裝置,作業系統提供了一組介面稱為系
統呼叫
 提供介於應用程式與硬體間的介面的好處
 它使得程式設計更為容易
 增加系統的安全性
 介面讓程式能夠獲得更佳的可攜性

64 陳鍾誠 - 110/11/02
執行系統呼叫
 使用者行程執行系統呼叫時, CPU 會切換至
核心模式,並開始執行核心函式
 為了將不同的系統呼叫號碼對應至適當的系統
呼叫服務常式, Linux 核心中使用了一個系統
呼叫分派表

65 陳鍾誠 - 110/11/02
執行一個系統呼叫
核心模式
使用者模式

system_call:

… xyz() { sys_xyz() sys_xyz()
xyz() … … {
… int 0x80 ret_from_sys_ca …
… ll: }
} …
iret

應用程式執 在 libc 標準程式庫


行系統呼叫 內的封裝常式 系統呼叫處理器 系統呼叫服務常式

66 陳鍾誠 - 110/11/02
參數傳遞
 呼叫系統呼叫時,通常需要傳遞參數給作業系

 在 Intel IA-32 的架構下,使用暫存器來傳遞
參數有 2 個條件必須滿足
 參數的長度不能超過暫存器大小
 參數的個數不能超過 6 個

67 陳鍾誠 - 110/11/02
封裝常式
 核心執行緒也能夠使用系統呼叫,只不過在核
心內不能夠使用程式庫的函式,因此需要透過
封裝常是來執行
 Linux 定義六個巨集來簡化封裝常式的宣告

68 陳鍾誠 - 110/11/02
系統呼叫流程圖
實體記憶體位址
0xFFFFFFFF

跳回使用者程式
4 libc
Int 0x80
3 函式庫
將系統呼叫號碼放在暫存器中
8
使用者 2
空間

清除堆疊
使用者
Call write() 程式碼
1 將 write() 所需參數放入堆疊
7
5 6
作業系統 指派 系統呼叫服
空間 務常式
system_call sys_call_table
0 () 69 陳鍾誠 - 110/11/02
第十六章 系統服務常式
 中斷簡介
 軟體中斷
 系統呼叫
 裝置驅動程式
 字元與區塊裝置
 核心程式環境
 撰寫裝置驅動程式
 摘要
70 陳鍾誠 - 110/11/02
裝置驅動程式
 裝置驅動程式是核心之中,由一些函式與資料所組成
的 I/O 裝置的軟體介面
 裝置驅動程式可以被多個使用者的應用程式所同時共

 Linux 裝置驅動程式有以下幾點特徵
 包含可以與硬體裝置溝通的常式,並提供作業系統統一的使
用介面
 裝置驅動程式是一個自訂的元件,可以動態地從作業系統中
加入或移除
 可以管理並控制在使用者程式與週邊裝置之間的資料傳遞
 包含一段使用者所定義的核心,可以讓程式或是週邊裝置以
"/dev" 目錄下的檔案形式供其他行程使用
71 陳鍾誠 - 110/11/02
裝置驅動程式與系統關係圖

使用者行程

/dev/dev_file
使用者空間

核心空間
裝置驅動程

硬體裝置

72 陳鍾誠 - 110/11/02
字元與區塊裝置
 字元和區塊裝置是 Linux 中兩種最主要的裝
置類別
 字元裝置與檔案相似,利用位元組串流方式存
取資料
 區塊裝置則可以使用檔案系統

73 陳鍾誠 - 110/11/02
核心程式環境
 驅動程式必須是核心的一部分,才可以服務中
斷與存取裝置硬體,並且要能夠有效率地處理
中斷
 多個行程同時共享裝置驅動程式中的中斷或是
同步區段的資料時,資料就必須要使用臨界區
以避免發生錯誤
 在多 CPU 的系統中無法利用關閉中斷的方
式來達到互斥,所以必須要利用旋轉鎖的方式
來實作臨界區
74 陳鍾誠 - 110/11/02
撰寫裝置驅動程式
 裝置驅動程式主要分為以下幾個部分
 初始函式
 註冊 IRQ 與中斷處理函式
 裝置操作函式
 離開函式

75 陳鍾誠 - 110/11/02
摘要 (1)
 中斷被定義為會暫停目前指令的執行而跳到特
定程式去執行的事件
 中斷大致可分為
 外部中斷
 例外中斷
 陷阱中斷
 軟體中斷
 中斷描述表主要的目的是將每個中斷或例外的
向量,對應到中斷或例外處理器的位址
76 陳鍾誠 - 110/11/02
摘要 (2)
 IDT 包含 3 種描述器型態
 任務閘門
 中斷閘門
 陷阱閘門
 Linux 的例外主要可達到兩種不同的目的
 傳送信號給行程告知有異常狀況發生
 處理需求分頁
 軟體中斷在 Linux 2.4 上包含 3 種型式
 底半部
 Softirq
 tasklet 77 陳鍾誠 - 110/11/02
摘要 (3)
 系統呼叫是介於應用程式與硬體間的一個額外
階層
 程式撰寫容易
 增加系統的安全性
 是程式獲得更佳的可攜性
 裝置的驅動程式主要分為四個部分
 初始函式
 註冊 IRQ 與中斷處理函式
 裝置操作函式
 離開函式
78 陳鍾誠 - 110/11/02
79 陳鍾誠 - 110/11/02

You might also like