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 请求 → 设备独立性软件检查权限、把字符串放入缓冲区、把逻辑设备名映射到具体的打印机 → 设备驱动程序把请求翻译成这台打印机的命令字,写进控制寄存器启动设备 → 打印完成后设备发出中断 → 中断处理程序保存现场、做善后、唤醒等待的进程。

四层的分工恰好对应四个动词:格式化 → 通用管理 → 翻译并启动 → 善后。

边界

哪些工作属于设备独立性软件

疑问点:适合由设备独立性软件完成的工作

  1. 下列设备管理工作中,适合由设备独立性软件来完成的有( )。 I. 向设备寄存器写命令 II. 检查用户是否有权使用设备 III. 将二进制整数转换成 ASCII 码格式打印 IV. 缓冲区管理

答案 II、IV。 逐条套用上面的判据:

I 向设备寄存器写命令——寄存器的编号、位宽、命令字的编码,每台设备都不一样。换一台设备这件事就得重写,因此属于设备驱动程序。

II 检查用户是否有权使用设备——任何设备都要做这项检查,做法也完全一样(查权限表),换设备仍成立 → 设备独立性软件。

III 将二进制整数转换成 ASCII 码——这是格式化,与设备毫无关系,甚至与”要不要 I/O”都无关,属于用户层 I/O 软件。

IV 缓冲区管理——所有设备都需要缓冲来抹平速度差,管理算法与设备无关,属于设备独立性软件。

注意 III 是本题最容易误选的一项:它确实”和打印有关”,但格式化发生在数据进入 I/O 系统之前,是纯粹的用户态计算。

哪些工作不属于设备驱动程序

疑问点:不属于设备驱动程序功能的选项

  1. 下列选项中,( )不属于设备驱动程序的功能。 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)归用户层,不归设备独立性软件
  • 中断处理程序在最底层,因为它由硬件反向触发,不在自上而下的调用链里

链接