# I/O 设备管理
# I/O 设备管理的硬件基础
# I/O 设备
# 概念
连接 CPU 的所有设备称为输入输出设备,简称设备 (外设)。其和 CPU 的连接通过总线、IO 接口 (设备控制器) 和 IO 端口。
# 分类
从不同的角度,设备可以分为输入设备和输出设备;高速设备和低速设备;字符设备和块设备;随机访问和顺序访问设备;互斥使用和并发使用的设备。其中,字符设备即顺序访问设备,信息交换以字符为单位,是无结构、传输速率低、不可寻址的设备,如打印机、鼠标等。块设备即随机访问设备,其信息交换以块为单位,是有结构、传输速率较高、可寻址的设备,如磁盘等。
# 设备控制器 (I/O 接口)
设备控制器又叫 I/O 接口,其主要由以下三部分组成:
- 设备控制器与 CPU 的接口
- 设备控制器与设备的接口
- I/O 逻辑:用于实现对设备的控制。
# I/O 端口
I/O 端口是指设备控制器中可被 CPU 直接访问的寄存器。包括以下三类共四个:
- 数据寄存器:包括数据输入寄存器 (data-in register) 和数据输出寄存器 (data-out register)。分别用来暂时存储主机需要读入和写出的数据。
- 状态寄存器 (status register):包含一些主机可以读取的位,例如当前命令是否完成、数据输入寄存器中是否有数据可以读取、是否出现设备故障等。
- 控制寄存器 (control register):可由主机写入,以便启动命令或更改设备模式。
CPU 与 I/O 端口的通信包括两种方式:
- 独立编址
- 统一编址:又叫内存映射 I/O (memory-mapped I/O),即内存与 I/O 设备采用相同的地址空间。
# I/O 控制方式
I/O 控制方式包括轮询方式 (程序直接控制方式)、中断方式、DMA 方式和通道控制方式。
# 轮询方式
# 中断方式
能够让设备通知 CPU 的硬件机制称为中断 (interrupt)。
采用中断驱动的 I/O 控制流程如下:
# DMA 方式
DMA 方式式的基本思想是在 I/O 设备和内存之间开辟直接的数据交换通路,彻底解放 CPU。DMA 方式的特点如下:
- 基本单位是数据块。
- 所传送的数据,是从设备直接送入内存的,或者相反。
- 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在 DMA 控制器的控制下完成的。
# 通道控制方式
# I/O 系统架构
I/O 系统架构即 I/O 设备管理的软件层次结构,包括应用程序、I/O 应用程序接口、内核 I/O 子系统、驱动程序、中断处理程序和外部设备。
# 驱动程序
直接控制设备的程序称为驱动程序,其可以直接读写控制器中的寄存器,一般情况下运行在内核态,是操作系统内核的一部分。
# 设备号
不同的设备具有不同的编号,编号记录在安装表 (mount table) 中。主设备号说明设备类型,据此找到驱动程序 (对应一类设备)。次设备号说明具体设备,可以作为驱动程序的参数。
# 设备依赖性
设备依赖的 (device-dependent) 指程序只能在特定的设备环境下运行,又翻译成设备相关的。相反的性质称为设备独立的 (device-independent),又翻译成设备无关的。
容易看出,驱动程序是设备依赖的。且驱动程序的目标是使上层的内核 I/O 子系统具有设备独立性,可以对设备的共性进行操作而不专注于设备的具体性质。因此,内核 I/O 子系统又称为设备独立性软件。
# 结构和功能
驱动程序的结构和功能是相适应的。驱动程序主要包括启动部分和中断服务例程 (ISR),分别用来启动设备和执行中断服务。在设备进行初始化时,需要确定中断号并注册服务例程。
中断号即中断类型号,是中断向量表中用于标注中断优先级的序号。
# 中断处理程序
这是一个不错的 blog:Linux 中断和中断上半部处理.