---
# System prepended metadata

title: Chap. 13 - I/O systems
tags: [課堂筆記, 作業系統]

---

# Chap. 13 - I/O systems

> 課程內容 : 清華大學開放式課程 周志遠教授
> 參考書目 : Operating System Concepts (9th), Abraham Silberschatz, Peter Baer, Galvin, Greg Gagne
> 
> 其他科目內容請參見 [[Here]](https://hackmd.io/@ChenZE/By4SOO6Jyl)

## Content
* [Overview](#Overview)
* [I/O hardware](#IO-hardware)
* [I/O methods](#IO-methods)
    * [1. How to address a device](#1-How-to-address-a-device)
    * [2. How to interact](#2-How-to-interact)
    * [3. Who to control](#3-Who-to-control)


## Overview

計算機(computer)有兩種主要的工作: (1) I/O 存取 (2) 計算。I/O devices 的種類非常多樣化，像是滑鼠(mouse)、網卡(netword card)、螢幕(screen)等都是屬於 I/O devices 的範疇。

(1) I/O subsystem
所有的 I/O devices 都有一個子系統(I/O subsystem)。I/O subsystem 提供了一些方法與機制來控制所有的 I/O devices。

(2) Drivers
Driver 提供一個統一的 interface 存取 I/O subsystem，讓 OS 與 I/O 間能夠溝通。類似於 system call 提供一個介面給 user 與 OS 之間。

## I/O hardware
一個 I/O device 有 3 種主要的硬體元件

(1) Port
I/O devices 與 host 端的連接點，是裝置與系統的連接口，例如 USB port。

(2) Bus
用來傳遞資料的 wires，可以是 controller 之間，也可以是 controller 與 device 之間。有兩種觀點可以看 Bus:

* 物理方式: 包含 wires 的設計
* Protocal: 關於資料如何傳輸的協定(Ex: 每次傳 4 bytes 大小的資料)

(3) Controller
實際控制 I/O devices 的電子零件，每個 controller 都會有屬於自己的 porcessor 與 memory 等硬體設備。

Controller/drivers/subsystem 三者關係如下

| 元件 | 角色/功能 | 範例 |
|---|---|---|
| I/O Subsystem | 作業系統的 I/O 管理模組，負責管理所有 I/O 設備，並決定如何分派請求，使用統一的 API 來提供 I/O 服務（例如 read()、write()） | 負責 `read()`、`write()` 這類的系統呼叫 |
| Driver | 負責將作業系統的 I/O 請求轉換成設備可理解的控制命令，並與 controller 溝通，處理特定硬體的細節 | SATA 硬碟驅動程式、USB 驅動程式、顯示卡驅動程式 |
| Controller | 真正與硬體進行溝通的電子元件，負責執行驅動程式傳來的指令，並控制設備運作 | 硬碟控制器（HDD Controller）、顯示卡控制器（GPU）、USB 控制器 |

![截圖 2025-02-20 上午11.25.23](https://hackmd.io/_uploads/S1teGm451l.png)

## I/O methods

每個 I/O port 都會有一個唯一的 port address，是一開始就已經在硬體上設計/指定好的位址。每個 I/O port 會由 4 個 register 組成

* Data-in register: 儲存來自 I/O 輸入的資料，並讓 host 端讀取
    * Writer: I/O
    * Reader: CPU
* Data-out register: 儲存來自 host 端的資料，並讓 I/O 輸出
    * Writer: CPU
    * Reader: I/O
* Status register: 儲存 I/O 狀態並讓 host 端讀取
* Control register: 儲存 host 端寫入的資料並用來控制 I/O

Program 與 I/O 的溝通方式會透過一組特殊的 I/O 指令(instruction)，且這些指令上中一定會指定 port address。例如: X86 的 `IN` 與 `OUT` 指令。

![截圖 2025-02-20 上午11.47.10](https://hackmd.io/_uploads/B15JLm49kg.png)

I/O method 指的是下指令的方式，可依不同面向來分類，這些面向可以隨機搭配使用。

### 1. How to address a device

決定 device 的位置有 2 種方式

* Port-mapped I/O
    * 直接使用 I/O instruction 告訴 CPU 要寫到哪個 port 的 I/O
* Memory-mapped I/O
    * 保留記憶體中的某個位置，這位置會對應到 I/O buffer。直接使用 data transfera 的指令(Ex: `MOV`)即可找到要寫入的 I/O
    * 適合大資料傳輸

### 2. How to interact

傳遞資料給 I/O device 的方式有 2 種

* Poll(busy-waiting)
    * CPU 會不斷地檢查 device 的狀態並主動的 push 資料
* Interrupt
    * Device 完成後才會發出訊號通知 CPU，CPU 是被動的接收訊號

### 3. Who to control

有 2 種方式可以對 I/O device 進行控制

* Programmed I/O
    * 直接由 CPU 控制 I/O 的傳輸
* Directed Memory Access(DMA)
    * 由一個特殊的硬體設備 DMA controller 控制 I/O 的傳輸，將資料載入到 memory 中提供給 CPU 使用。DMA controller 只會負責資料的搬移。
    * 適合大型資料的傳輸
    * 通常會搭配 memory-mapped I/O 與 interrupt 一起使用

![截圖 2025-02-20 上午11.47.26](https://hackmd.io/_uploads/By4F57Ecye.png)
