I/O 软件层次结构
5.1.1 立了硬件路径,这一节立软件路径:从用户程序调一句 printf,到磁头真的动起来,中间经过了哪几层软件。
这一节的选择题几乎全是同一种问法:给一件具体的事,问它归哪一层。因此本节的核心不是背四层的名字,而是拿到一条能当场判定归属的判据。

机制
四层各自做什么
自下而上依次是中断处理程序、设备驱动程序、设备独立性软件、用户层 I/O 软件。
① 中断处理程序(最底层)——设备完成工作后发出中断,该层保存被中断进程的 CPU 环境,转入相应的中断处理程序进行处理,处理完毕后恢复现场并返回。
② 设备驱动程序——与硬件直接相关,负责具体实现系统对设备发出的操作指令。它把上层来的抽象要求转换为具体要求(例如把”读逻辑块 100”转换成”移动到第 5 柱面、1 号磁头、7 号扇区”),检查请求的合法性,设置设备寄存器、启动设备。每一类设备都要配一个自己的驱动程序。
③ 设备独立性软件(设备无关软件)——执行所有设备的公有操作,共六项:
- 向设备驱动程序传送抽象要求
- 对设备进行保护,检查用户是否有权使用该设备
- 差错控制
- 缓冲管理
- 设备的分配与回收
- 建立逻辑设备名到物理设备名的映射关系(靠逻辑设备表 LUT,见 5.2.1)
④ 用户层 I/O 软件(最高层)——实现与用户交互的接口,用户可直接调用。它负责产生 I/O 请求、格式化 I/O,以及 SPOOLing 这类由用户级进程实现的功能。所谓”格式化”,就是 printf("%d", n) 里把二进制整数转换成一串 ASCII 字符这种事。
一条能当场判定归属的判据
疑问点:I/O 软件的分层归属难以记忆
这几层的职责始终记不住。
不要按”这一层有哪几项功能”去记,那是一张需要背的清单。改按一条判据去问,四层就能当场分开:
① 这件事是不是”把数据变成人要看的样子”? → 是,用户层 I/O 软件。
② 换一台设备,这件事还成不成立? → 成立,设备独立性软件;不成立,设备驱动程序。
③ 这件事是不是”设备说它好了,得赶紧应一声”? → 是,中断处理程序。
第 ② 条是全节的关键,它正是”设备独立性”这个名字的字面含义:这一层之所以叫”独立”,就是因为它做的事与具体是哪台设备无关。
用这条判据验一遍:缓冲管理——不管是磁盘还是打印机都要缓冲,换设备仍成立 → 设备独立性软件。向设备寄存器写命令——每台设备的寄存器编号和命令字都不同,换设备就不成立 → 驱动程序。检查用户权限——任何设备都要查,成立 → 设备独立性软件。
一次 I/O 请求穿过四层
以 printf 打印一个整数为例:
用户层把整数格式化成 ASCII 字符串,发出 I/O 请求 → 设备独立性软件检查权限、把字符串放入缓冲区、把逻辑设备名映射到具体的打印机 → 设备驱动程序把请求翻译成这台打印机的命令字,写进控制寄存器启动设备 → 打印完成后设备发出中断 → 中断处理程序保存现场、做善后、唤醒等待的进程。
四层的分工恰好对应四个动词:格式化 → 通用管理 → 翻译并启动 → 善后。
边界
哪些工作属于设备独立性软件
疑问点:适合由设备独立性软件完成的工作
- 下列设备管理工作中,适合由设备独立性软件来完成的有( )。 I. 向设备寄存器写命令 II. 检查用户是否有权使用设备 III. 将二进制整数转换成 ASCII 码格式打印 IV. 缓冲区管理
答案 II、IV。 逐条套用上面的判据:
I 向设备寄存器写命令——寄存器的编号、位宽、命令字的编码,每台设备都不一样。换一台设备这件事就得重写,因此属于设备驱动程序。
II 检查用户是否有权使用设备——任何设备都要做这项检查,做法也完全一样(查权限表),换设备仍成立 → 设备独立性软件。
III 将二进制整数转换成 ASCII 码——这是格式化,与设备毫无关系,甚至与”要不要 I/O”都无关,属于用户层 I/O 软件。
IV 缓冲区管理——所有设备都需要缓冲来抹平速度差,管理算法与设备无关,属于设备独立性软件。
注意 III 是本题最容易误选的一项:它确实”和打印有关”,但格式化发生在数据进入 I/O 系统之前,是纯粹的用户态计算。
哪些工作不属于设备驱动程序
疑问点:不属于设备驱动程序功能的选项
- 下列选项中,( )不属于设备驱动程序的功能。 A. 接收进程发来的 I/O 命令和参数,并检查其合法性 B. 查询 I/O 设备的状态 C. 发出 I/O 命令,启动 I/O 设备 D. 对 I/O 设备传回的数据进行分析和缓冲
答案 D。
A、B、C 都紧贴具体硬件:接收并检查针对这台设备的参数、读这台设备的状态寄存器、往这台设备的控制寄存器写命令字启动它——换一台设备,这三件事的做法全都要改,因此都是驱动程序的职责。
D 中的”缓冲”是通用的缓冲区管理,与设备无关,属于设备独立性软件(正是上一题的第 IV 项)。
这两道题恰好是同一条判据的正反两面,一起记效果最好。
设备独立性软件与设备驱动程序的分界
这是本节最高频的一对,判据已经给出:换设备还成不成立。
再补一条更形象的说法:设备独立性软件面对的是”一类设备”,设备驱动程序面对的是”一台设备”。
上层说”往打印机输出这段文字”,设备独立性软件把它变成”往 3 号打印机输出,数据在这个缓冲区里”,驱动程序才知道 3 号打印机的控制寄存器在哪个端口、命令字该怎么编。
中断处理程序为什么在最底层
因为它是被硬件直接触发的,不由上层调用。
其余三层是自上而下的调用关系(用户层调设备独立性软件,后者调驱动程序),而中断处理程序是设备”反向”通知上来的入口。它处在最底层,是因为它紧贴硬件事件,且它的执行不属于任何一次自上而下的调用链。
这也是 5.1.2 那道题的背景:中断响应的动作由硬件完成,中断处理程序则是软件的最底层。
对照速查
| 层次(自上而下) | 职责 | 一个动词 |
|---|---|---|
| 用户层 I/O 软件 | 产生 I/O 请求、格式化 I/O、SPOOLing | 格式化 |
| 设备独立性软件 | 传送抽象要求、保护、差错控制、缓冲管理、设备分配与回收、逻辑名→物理名映射 | 通用管理 |
| 设备驱动程序 | 把抽象要求转成具体要求、检查合法性、设置寄存器、启动设备 | 翻译并启动 |
| 中断处理程序 | 保存现场、处理、恢复现场 | 善后 |
| 判据 | 归属 |
|---|---|
| 把数据变成人要看的样子 | 用户层 |
| 换一台设备仍成立 | 设备独立性软件 |
| 换一台设备就不成立 | 设备驱动程序 |
| 设备说”我好了” | 中断处理程序 |
| 常考的具体工作 | 归哪层 |
|---|---|
| 向设备寄存器写命令 | 驱动程序 |
| 查询 I/O 设备状态 | 驱动程序 |
| 把逻辑块号译成盘面/磁道/扇区 | 驱动程序 |
| 检查用户是否有权使用设备 | 设备独立性软件 |
| 缓冲区管理 | 设备独立性软件 |
| 设备分配与回收 | 设备独立性软件 |
| 逻辑设备名→物理设备名 | 设备独立性软件 |
| 二进制整数转 ASCII | 用户层 |
| SPOOLing | 用户层 |
考点
- 四层自下而上:中断处理程序 → 设备驱动程序 → 设备独立性软件 → 用户层 I/O 软件
- 判据:换一台设备还成不成立——成立归设备独立性软件,不成立归驱动程序
- 设备独立性软件的六项公有操作(保护、差错控制、缓冲、分配回收、映射、传送抽象要求)
- 缓冲区管理归设备独立性软件,不归驱动程序(正反两道真题都考它)
- 格式化(二进制转 ASCII)归用户层,不归设备独立性软件
- 中断处理程序在最底层,因为它由硬件反向触发,不在自上而下的调用链里
链接
- 🏠 返回总览:操作系统第 5 章:输入/输出管理总览
- ⬅️ 上一节:5.1.2 I/O 控制方式
- ➡️ 下一节:5.1.4 应用程序 I/O 接口
- 🔗 设备独立性软件的六项工作展开,见 5.2.1 设备独立性软件
- 📖 名词库:第 5 章名词库