(一)IO 管理基础
1. IO 设备
1.1. IO 设备基本概念
一般由执行 IO 操作的机械部件和控制 IO 操作的电子部件组成;
执行 IO 的机械部件称为 IO 设备;
管理 IO 的电子部件称为:设备控制器/适配器或 IO 接口;
1.2. IO 设备分类
按使用特性:IO 设备,存储设备;
按传输速率:低速设备,高速设备;
1.3. IO 接口/端口
CPU 只能通过设备控制器间接与 IO 设备通信;
IO 设备应含有和设备控制器通信的接口,该接口中有三种类型信号,各对应一条信号线
数据信号;
控制信号;
状态信号;
基本功能
接收/识别命令;
数据交换;
标识和报告 IO 设备的状态;
识别地址;
数据缓冲;
差错控制;
组成部分
设备控制器
CPU 的接口; 设备控制器
IO 设备的接口; IO 逻辑(在上述二者中间)
图示

- CPU 控制器接口里的数据/控制/状态寄存器也称为 IO 端口;
2. IO 控制方式
主要三种:轮询,中断,DMA(Direct Memory Access);

2.1. 轮询
启动 IO 后,CPU 置位状态寄存器的 busy 标志;
然后不断测试 busy 标志位:若 busy 为 1 则表示 IO 设备还在工作,为 0 表示 IO 设备已经完成;
测试到 busy 为 0 后,再从数据寄存器中取出数据,然后再启动下一次 IO,直到所有数据传输完成;
2.2. 中断
启动 IO 时,CPU 向设备控制器发出 IO 命令,然后立即返回执行原来的任务;
设备控制器完成工作后,触发 CPU 的 IO 中断,CPU 再进行处理;
CPU 和设备控制器是并行工作;
2.3. DMA 直接存储器访问
普通 IO 是以字节为单位,每 IO 一个字节,设备控制器都要触发一次 CPU 中断,效率较低;
DMA 的特点
IO 的单位变为数据块,CPU 与 IO 设备每次至少传输一个数据块;
IO 设备的数据直接送入内存,CPU 的数据也是直接由内存送入 IO 设备控制器;
仅在一个或多个数据块传输完成时,才触发 CPU 中断进行处理,提高了 CPU 利用率;
DMA 控制器的组成

CPU
DMA 控制器接口; DMA 控制器
块设备接口; IO 逻辑;
DMA 工作过程(例如:从磁盘读入一个数据块)
预处理:CPU 向控制器发送读命令(送入寄存器 CR 中),同时将起始地址送入地址寄存器 MAR 中;
数据传输:CPU 启动 DMA 控制器,进行数据传输;
后处理:传输完成后,控制器触发 CPU 中断,进行相关处理;
3. IO 软件层次结构
通常是四个层次:用户层、设备独立性软件、设备驱动、中断处理程序;

3.1. 中断处理程序
层次结构中的最底流程层,实现 CPU 和 IO 设备并行,是整个 IO 系统的基础;
中断处理流程
进程申请 IO 时,该进程挂起,CPU 启动 IO 相关操作;
IO 设备完成操作后,向 CPU 发送中断请求;
CPU 收到中断请求,转向中断处理程序,执行相应处理;
处理完毕,解除进程阻塞状态;
中断处理程序
检测是否有未响应的中断请求;
保护被中断进程的 CPU 上下文;
转入相应的设备处理程序,处理中断;
退出中断,恢复 CPU 现场;
3.2. 驱动
设备处理程序又称为设备驱动程序,实现高层次 IO 软件和设备控制器之间的通信;
主要功能
高层次 IO 软件的请求
低层次设备控制器的指令; 检查 IO 请求的合法性;
检查 IO 设备的工作状态,传递 IO 设备操作有关的参数,设置 IO 设备工作方式;
管理和发送 IO 命令:若 IO 设备空闲则立即启动,若忙碌,应管理一个请求队列;
响应设备控制器的中断请求,并调用对应的中断处理程序;
特点
和硬件密切相关,不同类型的设备,其驱动程序也不同;
可以为多个终端设备配置一个驱动程序;
因为和硬件密切相关,其中的一部分必须采用汇编语言书写;
允许可重入:允许驱动程序一次调用完成前被再次调用;
设备处理方式
为每一类设备专门设置一个进程,执行此类设备 IO 操作;
整个 OS 只设置一个进程,管理和执行所有设备 IO 操作;
OS 提供对应的模块,供用户和系统进程调用;
工作过程
将上层软件的请求转换为具体指令;
校验 IO 请求合法性;
检查 IO 设备状态;
传递必要的 IO 操作参数;
启动 IO 设备;
3.3. 设备独立软件
设备独立性:也称为设备无关性,指应用程序进行的操作不局限于某种特定的物理设备;
设备调用方式:
1)使用物理设备名:早期 OS 中使用,deprecated;
2)使用逻辑设备名:如
/dev/printer;
设备驱动程序的统一接口
每个设备驱动程康与OS之间都有着相同或相近的接口,使添加一个新的设备驱动程序变得容易,同时在很大程度上方便了设备驱动程序的开发;
将抽象的设备名映射到适当的驱动程序上(或具体的物理设备名),并进一步可以找到相应物理设备的驱动程序入口;
其他功能:设备保护,禁止用户直接访问设备,以防止无权访问的用户使用;
缓冲管理
为了缓和 CPU 高速和 IO 设备低速之间的矛盾,现代 OS 中都分别为字符设备和块设备配置了相应的缓冲区;
多种形式:如单缓冲区、双缓冲区、循环缓冲区、公用缓冲池等;
差错控制
设备中有着许多的机械和电气部分,比主机更容易出现故障;
IO 设备的错误可分为两类:(1) 暂时性,(2) 持久性;
独立设备的分配和回收
- 对于独占设备,为了避免诸进程对独占设备的争夺,必须由系统来统一分配,不允许进程自行使用;
逻辑数据块
不同类型的设备,其数据交换单位不同,读取和传输速率也各不相同;
设备独立性软件负责在底层处理这些差异,向上层软件提供大小统一的逻辑数据块;
3.4. 用户层
系统调用
不允许运行在用户态的应用进程去直接调用运行在系统太的 IO 过程;
OS 在用户层中引入系统调用,应用程序可以通过它间接调用 OS 中的 IO 过程,操作 IO 设备;
库函数
库函数是实现系统调用的一种方式;
不是所有库函数都是系统调用;
库函数与调用程序连接在一起,被嵌入在运行时装入内存的二进制程序中;
例:Windows—Win32 API;
4. IO 应用程序接口
- 三种接口:块设备、流设备和网络接口;
4.1. 块设备接口
- 例:磁盘设备接口
4.2. 流设备接口
又称为字符设备接口,用于字符型 IO 设备(例如:键盘);
操作:get, put 等;
因字符设备的类型非常多,且差异甚大,系统以统一的方式提供了一种通用的 in-control 指令来处理它们
4.3. 网络设备接口
- 实现网络通信的功能;