Appearance
设备的基本概念与分类
2026 大纲 五(一)1 设备,补充说明点名四项:设备的基本概念、设备的分类、I/O 接口、I/O 端口。
又慢又杂,还各说各的话
前四章管的东西都相对规整:CPU 只有一种、内存是一片按地址编号的空间、 磁盘对文件系统而言也只是"一堆能按块号读写的格子"。
设备不一样。它们又慢又杂——键盘每秒几个字节,网卡每秒几百兆,差了八个数量级; 而且各说各的话:有的按字符来,有的按块来;有的能随机定位,有的只能顺序收发; 有的必须独占,有的可以共享。
如果让 CPU 直接去对付这些差异,每换一种外设就得改一次 CPU。 所以硬件先垫了一层:设备控制器。有了它,CPU 面对的不再是五花八门的电气信号, 而只是"若干个可被寻址的寄存器"这一种统一形态——这是软件层设备独立性的硬件前提。
垫完这一层,剩下的问题就都是软件的了,而它们构成本章的主线:
CPU 用什么姿势等这些慢设备(I/O 控制方式:轮询 → 中断 → DMA → 通道)→ 这些姿势怎么封装成人能用的东西(软件层次、 应用程序接口、驱动程序)→ 速度差怎么抹平(缓冲、SPOOLing、 设备分配)→ 最后落到最重要的那个设备上(磁盘与 SSD)。
这一节是起点,先把术语和分类立住。要留意的是四套分类标准不是重复劳动—— 每一套服务于操作系统的一个不同决策,同一台打印机既是"字符设备"又是"独占设备", 两句话并不冲突。
一、四个词先分清
考纲这一条点了四个词,其中三个指的是同一条链上不同粒度的东西。教材把控制器的两侧分别称为"设备与控制器之间的接口"与"控制器与处理机之间的接口"——凡是"接口",指的都是硬件这一层;一个 I/O 接口内部有若干个 I/O 端口。
二、设备控制器(I/O 接口)
六项功能不是罗列,而是"要把 CPU 从设备事务里解脱出来"这一目标逐项推出来的:
| 功能 | 为什么非有不可 | 对应的硬件 |
|---|---|---|
| 接收和识别命令 | CPU 只发一句 read,控制器得知道这是 15 条命令中的哪一条、带什么参数 | 控制寄存器 + 命令译码器 |
| 数据交换 | 数据要在 CPU↔控制器、控制器↔设备两段之间搬 | 数据寄存器 |
| 标识和报告设备状态 | CPU 必须先知道设备忙不忙才敢启动它 | 状态寄存器(每一位表示一种状态) |
| 地址识别 | 一块控制器可能挂多台设备,且它自己的每个寄存器也要有唯一地址 | 地址译码器 |
| 数据缓冲 | 设备速率远低于 CPU 与内存,不缓冲就只能让快的一方等慢的一方 | 控制器内的缓冲区 |
| 差错控制 | 设备传输易错,错误要在离硬件最近的地方发现 | 差错检测码 + 出错置位报告 |
I/O 逻辑对 CPU 送来的地址译码、选中某个设备接口,再按译出的命令控制设备。
三、I/O 端口的编址方式
| 独立编址(专用 I/O 指令) | 统一编址(内存映像 I/O) | |
|---|---|---|
| 地址空间 | 端口自成一套地址空间,与内存地址互不干扰 | 端口占用内存地址空间的高端一段(地址 < n 是内存,≥ n 是端口) |
| 指令 | 必须用专用 I/O 指令,如 io-store cpu-reg, dev-no, dev-reg | 普通访存指令即可,如 store cpu-reg, n |
| 硬件代价 | 需要一根 M/IO# 之类的控制线区分本次访问的是内存还是端口 | 不需要额外控制线,但内存地址空间被切走一块 |
| 编程代价 | 访问内存与访问设备要写两套指令,高级语言难以直接表达 | 一套指令通吃,指针可直接指向设备寄存器,编程灵活 |
| 保护 | 专用 I/O 指令是特权指令,天然只能内核态执行 | 靠页表权限位来挡,需要额外配置 |
统一编址的代价是实打实的:把端口映射进内存地址空间,意味着这段地址不能再装物理内存。早期 32 位机器实际可用内存常常卡在 3.2~3.5 GB 而不是 4 GB,原因之一就是显存和各类设备寄存器占走了地址空间的高端——这不是"内存坏了",是地址被设备占用了。
I/O 通道:DMA 之上的那一层,以及三种通道类型(本条已不在现行大纲内,想看清 DMA 的能力边界时展开)
现行 408 大纲 五(一)2 I/O 控制方式只列了三条:轮询方式、中断方式、DMA 方式,没有通道方式。保留这一节是因为通道处在 DMA 之上的一层,看清"DMA 只搬一段参数固定的数据、通道能自己取指令执行一串 I/O 任务"这个层级关系,反过来能把仍在纲内的 DMA 的能力边界看得更准。了解即可,不必记忆细节。
通道是专门用于 I/O 操作的处理器,可以独立于 CPU 执行 I/O 操作。它与一般处理机的两点不同:指令类型单一(只有与 I/O 有关的指令)、没有自己的内存(通道程序放在主机内存里,与 CPU 共享内存)。
| 类型 | 特点 |
|---|---|
| 字节多路通道 | 含许多非分配型子通道,按字节交叉、时间片轮转为多个慢速设备服务 |
| 数组选择通道 | 只含一个分配型子通道,一段时间内被一台高速设备独占,传完才让给下一台 |
| 数组多路通道 | 结合以上两种:多个非分配型子通道,以数据块为单位轮流服务 |
考点速记
- 三级粒度:I/O 设备(执行 I/O 操作的机械部件)→ 设备控制器(执行 I/O 控制的电子部件,就是硬件意义上的"I/O 接口")→ I/O 端口(控制器内部一个可被 CPU 寻址的寄存器)。
- ⚠️**"端口"与"寄存器"是同一批硬件的两种站位:从控制器内部看是寄存器(有位宽、有含义),从 CPU 地址空间看是端口**(有地址、可被寻址)。"有几个端口"
"有几个可被 CPU 寻址的寄存器",通常至少数据、状态、控制三个。 - ⚠️与另一个"接口"划清界限:应用程序 I/O 接口是软件 API。判据——本篇的接口插在主板上,那篇的接口写在头文件里。
- 四套分类标准各自决定 OS 的一个决策,不是重复分类:按使用特性分决定归哪个子系统管;按传输速率分决定选哪种 I/O 控制方式与缓冲策略;按信息交换单位分(块/字符)决定用哪套接口与驱动模型;按共享属性分(独占/共享/虚拟)决定设备分配时能不能同时给多个进程。
- ⚠️块 / 字符的分界是"能不能寻址",不是快慢:块设备以固定大小数据块为单位、每块有地址、可随机访问;字符设备以单个字符为单位、不可寻址、只能顺序收发。打印机不快,但你无法对它说"把第 37 块重打一遍",所以它是字符设备。 另一条推论:块设备才谈得上磁盘调度。
- 为什么必须隔一层控制器:设备的电气与时序差异若由 CPU 直接对付,每换一种外设就得换一次 CPU。插一层后 CPU 只面对"若干个寄存器"这一种统一形态——这是软件层设备独立性的硬件前提。
- 控制器六项功能:接收和识别命令、数据交换、标识和报告设备状态、地址识别、数据缓冲、差错控制。三部分组成:与处理机的接口、与设备的接口、I/O 逻辑。
- 端口编址二选一的差别是省地址费指令(独立编址,要专门的 I/O 指令)还是省指令费地址(统一编址,用普通访存指令但占掉一段内存地址空间)。
这一节在真题里被考过的形式:
概念铺垫性质的一节,只出过一道题,考的还是速记第五条那个分界。
- 判断关于驱动程序的四条描述,选错误的(2026-31)。错项是"字符设备、块设备都是同一种 I/O 方式"。⚠️ 两者的 I/O 方式从根上就不同——块设备可寻址、能随机访问、按块传输、要走磁盘调度;字符设备不可寻址、只能顺序收发、按字符传输。另三条都对:驱动程序是硬件与 OS 之间的接口程序、需根据硬件特性定制开发、需要设置统一的接口(这三条在设备驱动程序接口展开)。
复习优先级:读懂即可,重点在第五条那个分界。 "块/字符看能不能寻址而不是看快慢" 是本章反复用到的判据(设备分配、缓冲、磁盘调度都要用),一定要记牢。 第一到三条的术语链在题干里出现频率高,但很少单独设问;第七、八条属于组成原理的地界, 了解即可。
易错:认为字符设备和块设备只是快慢之分。分界是能不能寻址——打印机不快,但不可寻址,所以是字符设备。
易错:把硬件的"I/O 接口"(控制器)和软件的"应用程序 I/O 接口"混为一谈。一个插在主板上,一个写在头文件里。
易错:认为"端口"和"寄存器"是两样东西。同一批硬件的两种站位——对内是寄存器,对 CPU 地址空间是端口。
易错:认为四套分类标准是重复劳动。每一套服务于 OS 的一个不同决策,同一台设备在四个维度上各取一个值。
易错:认为字符设备也需要磁盘调度。只有块设备才谈得上——不可寻址就无从"调度访问顺序"。
教材出处
- 设备控制器的六项基本功能、三部分组成:汤小丹《计算机操作系统》6.2.2 节,印刷 p184–185
- 利用特定 I/O 指令与内存映像 I/O 两种设备寻址形式:同书 6.2.3 节,印刷 p185–186
- I/O 通道的引入与三种通道类型:同书 6.2.4 节,印刷 p186–187
相关知识
I/O 控制方式|I/O 软件层次结构|设备分配与回收|输入输出应用程序接口|SPOOLing 技术