電腦系統的組織架構 (Computer-System Organization)
本系列文章內容參考自經典教材 Operating System Concepts, 10th Edition (Silberschatz, Galvin, Gagne)。本文對應章節:Section 1.2 Computer-System Organization。
基本架構
一台現代通用電腦由一個或多個 CPU 與多個裝置控制器組成,透過共享匯流排 (System Bus) 連接,並共享一塊主記憶體:
| 元件 | 說明 |
|---|---|
| CPU | 執行指令的處理器,內含暫存器 (Registers) 與快取 (Cache) |
| Device Controller(裝置控制器) | 負責控制特定類型的 I/O 裝置,內含 local buffer storage 與特殊暫存器 |
| Memory Controller(記憶體控制器) | 協調所有元件對共享記憶體的存取,避免同時存取時產生衝突 |
| System Bus(系統匯流排) | 連接所有元件的主要通訊路徑,也是各元件爭搶記憶體週期的地方 |
每個 Device Controller 對應一個由 OS 提供的 Device Driver(裝置驅動程式):
- Device Controller(硬體層):實際控制 I/O 裝置
- Device Driver(軟體層,屬於 OS):理解 Controller 的工作方式,並為 OS 提供統一的介面
透過 Device Driver,OS 不需要了解每種裝置的硬體細節,只需呼叫統一介面即可。CPU 和 Device Controllers 可以並行執行,彼此競爭對記憶體的存取權。
在上圖中,Memory Controller 並未以獨立方框呈現,而是概念上夾在 System Bus 與 Main Memory 之間,負責仲裁(Arbitrate)所有元件對記憶體的存取請求。當 CPU 與 Device Controller 同時發出讀寫記憶體的請求時,Memory Controller 負責排隊調度、避免衝突,可以把它理解為從 System Bus 進入 Main Memory 的守門員,每一筆記憶體存取都必須通過它。
- 傳統架構(Intel Hub Architecture):Memory Controller 是主機板上一顆獨立晶片(Northbridge,北橋晶片),CPU 必須透過系統匯流排再經由北橋才能存取記憶體,延遲較高。
- 現代架構:Intel Core、AMD Ryzen 等處理器已將 Memory Controller 整合進 CPU 晶片內,稱為 IMC(Integrated Memory Controller),大幅縮短延遲並提升記憶體頻寬。
System Bus 是真實存在的硬體,在傳統電腦中指主機板(Motherboard)上的一組實體導線(PCB Traces),負責傳輸三類訊號:
| 匯流排類型 | 說明 |
|---|---|
| Address Bus(位址匯流排) | 傳送記憶體位址,告知要存取哪個位置 |
| Data Bus(資料匯流排) | 傳送實際的資料內容 |
| Control Bus(控制匯流排) | 傳送讀/寫控制訊號、中斷信號等 |
不過,「System Bus」在教科書中也作為簡化的抽象模型使用。現代電腦早已不再使用單一共享匯流排,而是改用 PCIe、DMI(Intel)、HyperTransport/Infinity Fabric(AMD)等點對點(Point-to-Point)高速序列介面,讓多對元件能夠同時通訊而不互相競爭。教科書以 System Bus 作為說明模型,重點在於讓讀者理解「所有元件共享一個通訊媒介、因此會發生競爭」的概念,而非現代硬體的具體實作。
1.2.1 中斷 (Interrupts)
以一次典型的電腦操作為例:一支程式正在執行 I/O,假設是從鍵盤讀取一個字元。整個過程分三個階段:
- Device Driver 設定指令:OS 中的 Device Driver 將讀取指令寫入 Device Controller 的暫存器(Registers)。這個設定過程非常短暫,在時間線圖中對應到 I/O transfer 那一小段。
- Device Controller 自主執行:Device Controller 讀取暫存器,確認動作(如「從鍵盤讀取一個字元」),然後將資料從 I/O 裝置搬移到它的 local buffer。在這段期間,CPU 完全不介入,繼續執行其他工作。
- 傳輸完成,通知 Driver:資料搬移完成後,Device Controller 必須通知 Device Driver。若是讀取操作,Driver 回傳資料或指向資料的指標;若是寫入操作,則回傳「write completed successfully」之類的狀態。
那麼,Controller 要如何通知 Driver 操作已完成? 這就是中斷(Interrupt)的用途。
中斷的基本流程
硬體可以在任何時間,透過 System Bus 向 CPU 發送信號來觸發中斷。當 CPU 收到中斷信號時,它會立刻停止目前正在做的事,並將執行權轉移到一個固定位置(Fixed Location)。這個固定位置存放的是該中斷對應的 ISR(Interrupt Service Routine,中斷服務程序) 的起始位址。ISR 執行完畢後,CPU 恢復被中斷前的工作,就像什麼都沒發生一樣。
下圖呈現了一次 I/O 操作期間,CPU 與 I/O 裝置的時間線關係:
時間線上各標記的含義:
- I/O request:CPU(透過 Device Driver)向 Device Controller 發出 I/O 指令
- I/O transfer:Device Driver 將指令寫入 Device Controller 暫存器的短暫設定過程,完成後 CPU 即可去做其他事
- I/O starts → interrupt 之間:Device Controller 正在自主執行資料搬移,CPU 完全不介入,繼續執行 user program(兩者並行運作)
- I/O interrupt processing:即 ISR,CPU 暫停 user program,執行中斷服務程序來處理 I/O 完成事件
- return:ISR 結束,CPU 恢復被中斷的 user program
這張圖最核心的洞察是:CPU 不需要等待 I/O 完成。在 I/O 傳輸期間,CPU 繼續做其他工作;只有當裝置完成並送出中斷信號後,CPU 才短暫切換去執行 ISR,完成後立刻回到原本的工作。若沒有中斷機制,CPU 只能原地等待每一次 I/O,大量運算能力將被浪費。
ISR 並不是「傳輸資料」的過程,而是在 I/O 完成後的善後處理。以鍵盤讀取字元為例,鍵盤 ISR 的工作通常包含:
- 從 Device Controller 的 local buffer 讀取那個字元
- 將字元存入 OS 維護的鍵盤輸入緩衝區(Keyboard Input Buffer)
- 喚醒正在等待鍵盤輸入的 Process(讓它可以繼續執行)
所以圖中的「I/O interrupt processing」就是 ISR 在做上述這些事。ISR 結束後,CPU 完全恢復被打斷的工作,那支程式感知不到任何差異。
「固定位置(Fixed Location)」,指的是記憶體中一個預先約定好的位址,也就是中斷向量表(Interrupt Vector Table)中對應該中斷編號的 ISR 起始位址。「固定」的意義在於:無論何時發生同類型的中斷,CPU 都固定去這個位置找處理程式,不需要臨時搜尋。
中斷的分派:Interrupt Vector
中斷觸發後,CPU 必須找到對應的 ISR。最直觀的做法是設計一個通用程式(Generic Routine):先檢查是哪個裝置觸發中斷,再呼叫對應的中斷特定處理程式(Interrupt-Specific Handler)。但中斷發生的頻率非常高,多一層中轉搜尋的設計太慢。
現代系統改用中斷向量(Interrupt Vector):一張存放在記憶體低位址區(前幾百個位置)的指標陣列(Pointer Array),每個 entry 存放一個 ISR 的起始位址。每個中斷請求都帶有一個唯一的中斷號碼(Interrupt Number),CPU 用這個號碼直接索引陣列,取得 ISR 位址後立刻跳轉,完全不需要中間搜尋的步驟。Windows 和 UNIX 都採用這種方式分派中斷。
除了需要儲存 ISR 跳轉位址,中斷架構還必須保存被中斷程式的執行狀態(包括 Program Counter 和各暫存器的值),才能在 ISR 結束後正確恢復執行。若 ISR 在執行過程中需要修改暫存器,也必須在返回前自行還原這些值,確保被中斷的程式感知不到任何差異。
以 Intel 處理器的中斷向量表為例,向量編號 0–31 屬於系統保留的 Nonmaskable 事件(各類硬體錯誤與例外),向量編號 32–255 則屬於 Maskable,供各裝置的中斷使用:
| 向量號碼 | 說明 | 類型 |
|---|---|---|
| 0 | Divide Error(除以零) | Nonmaskable |
| 1 | Debug Exception | Nonmaskable |
| 3 | Breakpoint | Nonmaskable |
| 13 | General Protection | Nonmaskable |
| 14 | Page Fault | Nonmaskable |
| 0 – 31 | 各類錯誤與例外(保留給系統) | Nonmaskable |
| 32 – 255 | 裝置產生的中斷(可由各裝置使用) | Maskable |
中斷的實作機制
CPU 硬體上有一條專用線路:Interrupt-Request Line(中斷請求線),CPU 在執行完每一條指令後都會偵測它。當 CPU 偵測到 Device Controller 在這條線上送出信號時,會讀取中斷號碼(Interrupt Number),以此號碼為索引查詢中斷向量,找到對應 ISR 的位址後跳轉執行。
ISR 進入後的工作流程如下:
- 保存狀態:儲存所有在 ISR 執行期間會被修改的暫存器值
- 判斷原因:確認是哪個裝置或哪種事件觸發了這次中斷
- 處理事件:執行對應的服務(如讀取資料、更新緩衝區、喚醒等待的 Process)
- 還原狀態:恢復先前儲存的暫存器值
- 返回:執行 return from interrupt 指令,CPU 回到被中斷前的執行點
這四個動詞是描述中斷完整生命週期的標準術語:
| 術語 | 執行者 | 說明 |
|---|---|---|
| Raise | Device Controller | 拉高 Interrupt-Request Line,斷言(assert)中斷請求 |
| Catch | CPU | 偵測到 Interrupt-Request Line 上的信號 |
| Dispatch | CPU | 查詢 Interrupt Vector,跳轉至對應的 ISR |
| Clear | Interrupt Handler (ISR) | 完成服務,中斷被清除 |