I/O 设备

第 5 章处理的是操作系统与外部世界打交道的那一部分。它之所以比前四章更容易显得零碎,是因为这里的名词大多来自硬件——控制器、通道、端口、寄存器——而不是像进程、页面那样的软件抽象。

读这一章的正确姿势是先把”一条 I/O 路径”立起来:

CPU → (通道)→ 设备控制器 → 设备

后面所有的名词都挂在这条路径的某一段上,包括本节的端口与寄存器、5.1.2 的四种控制方式、5.2.3 的四张控制表。先记住这条路径,名词就有了位置。

机制

I/O 设备的三种分类

按信息交换的单位分为块设备与字符设备。块设备如磁盘,信息以数据块为单位存取,有结构、可寻址,传输速率较高,能采用 DMA 方式。字符设备如键盘、打印机,信息以字符为单位,无结构、不可寻址,传输速率低,常采用中断驱动方式。

按传输速率分为低速设备(键盘、鼠标,每秒几到几百字节)、中速设备(行式打印机)、高速设备(磁盘,每秒数百 KB 到数十 MB)。

按设备的共享属性分为独占设备(一段时间内只允许一个用户访问,如打印机)、共享设备(可由多个进程同时访问,如磁盘)、虚拟设备(通过 SPOOLing 技术把独占设备改造成可共享的)。

设备控制器

设备控制器(I/O 接口)是 CPU 与 I/O 设备之间的中间层,它的存在理由很直接:CPU 无法直接驱动千差万别的物理设备——磁盘要控制磁头、打印机要控制走纸、键盘要扫描按键,若这些细节都由 CPU 处理,CPU 就没法干别的了。

控制器由三部分组成,这三部分正好对应”上接 CPU、下接设备、中间干活”:

① 设备控制器与 CPU 的接口——用于实现 CPU 与控制器之间的通信,有三类信号线:数据线传送读写数据、控制信息和状态信息;地址线传送要访问的 I/O 接口中的寄存器编号;控制线传送读写等控制信号。

② 设备控制器与设备的接口——一个控制器可连接一台或多台设备,因此可以有多个这样的接口,每个接口中都有数据、控制和状态三种信号。

③ I/O 逻辑——用于实现对设备的控制。它通过一组控制线与 CPU 交互,对收到的命令进行译码,再根据译码结果去控制设备。

疑问点:设备控制功能的实际执行部件

  1. 在设备控制器中用于实现设备控制功能的是( )。 A. CPU B. 设备控制器与处理器的接口 C. I/O 逻辑 D. 设备控制器与设备的接口

  2. 为了便于上层软件的编制,设备控制器通常需要提供( )。 A. 控制寄存器、状态寄存器和控制命令 B. I/O 地址寄存器、工作方式状态寄存器和控制命令 C. 中断寄存器、控制寄存器和控制命令 D. 控制寄存器、编程空间和控制逻辑寄存器

第一题答案 C,第二题答案 A。

第一题考的是三部分的分工:两个”接口”只负责连通(一个连 CPU、一个连设备),真正对命令译码并实施控制的是 I/O 逻辑。CPU 只是发出命令,不参与设备控制的细节。

第二题问的是”为了便于上层软件的编制”,即软件能看到什么。软件通过读写寄存器与控制器打交道:往控制寄存器里写命令、从状态寄存器里读设备状态,配合一组控制命令。选项 B、C、D 里的”编程空间""控制逻辑寄存器”等都不是标准部件。

补充:分清“三类寄存器”与“软件控制接口”

  • 问 CPU 与设备控制器接口中的三类寄存器:答数据寄存器、状态寄存器、控制寄存器,侧重硬件组成。
  • 问 为了便于上层软件编制,需要提供什么:本题选 A:控制寄存器、状态寄存器和控制命令,侧重软件如何控制设备:写控制信息、读设备状态,以及有哪些可用操作(如读、写、复位)。控制命令是操作约定,不是另一类寄存器。

没有列出数据寄存器,不代表控制器没有它,也不代表软件不能访问它;这里只强调控制设备所需的接口。记住:数据寄存器解决“数据怎么传”,控制寄存器+状态寄存器+控制命令解决“软件怎么管设备”。

图中”I/O 逻辑与控制电路”一栏的”他址译码”应为”地址译码”,是配图生成时的笔误。

设备控制器的六项功能

接收和识别命令(CPU 发来的多种命令,控制器要能识别)、数据交换(CPU 与控制器、控制器与设备之间)、标识和报告设备状态、地址识别(识别自己所控设备的地址)、数据缓冲(因为设备与 CPU 速率差异巨大)、差错控制。

其中”数据缓冲”值得单独记:它是控制器自带的一小块存储,用来抹平 CPU 与设备之间的速度差。这与 5.2.2 讲的内存缓冲区是同一动机在不同层次上的两次实现。

I/O 端口与两种编址方式

I/O 端口是设备控制器中可被 CPU 直接访问的寄存器,主要有三类:数据寄存器(实现 CPU 与外设之间的数据缓冲)、状态寄存器(获取执行结果和设备状态,只读)、控制寄存器(由 CPU 写入,以设置工作方式或启动/停止设备)。

要让 CPU 能访问这些端口,必须给它们编址,有两种做法:

独立编址——为每个端口分配一个 I/O 端口号,所有端口构成 I/O 端口空间,与内存地址空间分开,普通用户程序不能访问,只有操作系统使用特殊的 I/O 指令才能访问。

内存映射 I/O(统一编址)——把 I/O 端口当作存储单元对待,给它们分配内存地址空间中的一段地址。CPU 用普通的访存指令就能操作 I/O 端口,不需要专门的 I/O 指令。

两者的取舍很清楚:独立编址下 I/O 指令是特权指令,保护天然更严;内存映射 I/O 则指令系统更简洁、编程更方便,代价是要靠地址空间的划分来做保护。

I/O 通道

疑问点:控制器与通道的作用及其相互关系

控制器与通道各自的作用是什么,两者的关系如何。

通道是一种特殊的处理机,它有自己的指令系统(通道指令),能够执行存放在主存中的通道程序,从而独立完成一整批 I/O 操作。

理解通道的关键是问”它替谁分担了什么”:

没有通道时,CPU 每完成一次数据传送就要被打断一次(中断驱动),或者每传完一个数据块被打断一次(DMA)。块数一多,CPU 仍然要频繁被中断。

有了通道之后,CPU 只需向通道发出一条 I/O 指令,指明通道程序在内存中的位置和要操作的设备,通道就会自己把整批操作做完(可能涉及多个数据块、多台设备),做完之后才向 CPU 发一次中断。

所以三者的关系是一条严格的层级委托链:

CPU 委托通道完成”一批操作” → 通道委托控制器完成”一次操作” → 控制器直接驱动设备。

每往下一层,粒度就细一级,被打扰的次数就少一个数量级。 一个通道可以连接多个设备控制器,一个控制器可以控制一台或多台设备。

疑问点:属于硬件机制的技术

  1. 在操作系统中,( )指的是一种硬件机制。 A. 通道技术 B. 缓冲池 C. SPOOLing 技术 D. 内存覆盖技术

答案 A。 通道是一个真实存在的处理机部件,要花钱买的硬件。

其余三项都是软件手段:缓冲池是操作系统在内存中划出来的一片区域并配上管理算法;SPOOLing 是靠磁盘上的输入井输出井加两个系统进程实现的(见 5.2.4);内存覆盖技术是由程序员划分覆盖段、由操作系统装入的软件方案。

判据很简单:能不能在主板上指出它在哪。

边界

字符设备的”不可寻址”体现在哪里

疑问点:字符设备不可寻址的具体表现

字符设备的不可寻址体现在哪里。

“不可寻址”的意思是:这类设备上的数据没有”位置”这个概念,因而无法指定要读写的地址。

块设备之所以可寻址,是因为它的数据是”存放着的”——磁盘上第 100 块永远在那里,只要不覆盖,今天读和明天读得到的是同一份内容,所以可以说”给我第 100 块”。

字符设备的数据是”流过去的”。键盘敲下的字符、串口传来的字节,它们没有编号,也不在设备上驻留:读走就没了,没读走就在缓冲区里排队。因此”读第 5 个字符”这句话在字符设备上根本无法定义——第 5 个是相对于什么时候而言的?

由此推出一系列后果:字符设备只能顺序存取,不能随机访问;它无结构(没有”块”这个划分单位);它的操作是 get/put 这种”取下一个”的形式,而不是块设备的”读第 N 块”。

这条判据也是下面那道选择题的解题依据。

共享设备必须可寻址

疑问点:设备属性的正确表述

  1. 下列关于设备属性的叙述中,正确的是( )。 A. 字符设备的基本特征是可寻址到字节,即能指定读/写操作的字节地址 B. 共享设备必须是可寻址的和可随机访问的设备 C. 共享设备是指同一时刻内允许多个进程同时访问的设备 D. 在分配共享设备和独占设备时都可能引起进程死锁

答案 B。

B 为什么对:共享意味着多个进程交替使用同一台设备。若设备不可寻址,进程甲读到一半被打断、进程乙插进来读,甲回来后无法回到自己原来的位置——数据流已经被搅乱了。只有可寻址、可随机访问,各进程才能各自记住自己的位置、互不影响。 这也解释了为什么磁盘是典型的共享设备,而打印机不是。

A 错:字符设备恰恰不可寻址,见上一条。

C 错在”同一时刻”。共享设备是宏观上多个进程同时访问、微观上交替访问——任一瞬间仍只有一个进程在真正使用它。这与并发与并行的区别是同一回事。

D 错:只有独占设备才可能引起死锁。死锁的四个必要条件之一是互斥条件,而共享设备根本不需要互斥占用,不满足互斥条件就不会死锁。

数据线上的”控制信息”与控制线上的”控制信号”

疑问点:数据线传送的控制信息与控制线传送的控制信号的区别

教材原文:“数据线传送的是读/写数据、控制信息和状态信息;控制线传送的是读/写等控制信号。” 两处的”控制”有何区别。

判据是:控制线传的是”现在做哪一类总线动作”,数据线传的控制信息是”具体做什么”。

控制线上的控制信号是硬件时序信号,取值只有寥寥几种——读、写、中断请求、总线请求之类。它由硬件电路直接解释,不经过任何软件,作用是告诉总线上的各方”这一拍是读周期还是写周期”。

数据线上的控制信息是一条给设备的命令字,例如”磁头移动到第 30 道""以 9600 波特率工作""开始打印”。它本质上是一串数据,由 CPU 通过一次写操作送进控制器的控制寄存器,再由 I/O 逻辑译码后转成对设备的具体动作。

把两者串起来看就清楚了:CPU 要让磁盘寻道,会先在控制线上发出”写”信号(告诉控制器这是一次写寄存器的操作),同时在地址线上给出控制寄存器的编号,并在数据线上送出”寻道到第 30 道”这条命令。控制线决定了这次总线操作的性质,数据线承载了操作的内容。

通道、控制器、DMA 控制器的层次

三者常被并列比较,但它们不在同一层:

通道是处理机级的,能执行通道程序,可以自主完成一批操作。

DMA 控制器是数据块级的,只能在一次配置下搬运一个(或一组连续的)数据块,搬完就要中断 CPU。

设备控制器是设备级的,负责把命令译码成对某一台具体设备的动作。

规律是:越往上,一次委托能完成的工作越多,CPU 被打扰得越少。 这条规律就是 5.1.2 四种控制方式演进的主线。

对照速查

分类口径类别
按信息交换单位块设备(有结构、可寻址、可 DMA)/字符设备(无结构、不可寻址、常用中断)
按传输速率低速(键鼠)/中速(打印机)/高速(磁盘)
按共享属性独占(打印机)/共享(磁盘)/虚拟(SPOOLing 造出来的)
设备控制器三部分作用
与 CPU 的接口数据线、地址线、控制线
与设备的接口数据、控制、状态三种信号;可有多个
I/O 逻辑对命令译码并实施控制(真正干活的)
I/O 端口三类寄存器用途
数据寄存器CPU 与外设之间的数据缓冲
状态寄存器获取状态,只读
控制寄存器CPU 写入,设置工作方式 / 启停设备
编址方式特点
独立编址单独的 I/O 端口空间,需专门的 I/O 指令,保护天然更严
内存映射 I/O占用内存地址空间,用普通访存指令,编程方便
层次一次委托的粒度完成后
通道一整批操作(多块、多设备)才中断 CPU 一次
DMA 控制器一个数据块中断 CPU 一次
设备控制器一次设备动作—

考点

  • 块设备可寻址、可 DMA;字符设备不可寻址、只能顺序存取
  • 共享设备必须可寻址且可随机访问(否则各进程的位置会互相搅乱)
  • 共享设备是宏观上同时、微观上交替;只有独占设备会引起死锁
  • 控制器三部分中,I/O 逻辑才是实施控制的部件
  • 便于上层软件编制的是控制寄存器、状态寄存器和控制命令
  • 状态寄存器只读,控制寄存器由 CPU 写
  • 通道是硬件;缓冲池、SPOOLing、覆盖技术都是软件
  • 控制线传总线动作的性质,数据线传命令的内容
  • 委托链:CPU → 通道(一批)→ 控制器(一次)→ 设备

链接