# I/O 设备管理

# I/O 设备管理的硬件基础

# I/O 设备

# 概念

连接 CPU 的所有设备称为输入输出设备,简称设备 (外设)。其和 CPU 的连接通过总线IO 接口 (设备控制器) 和 IO 端口

# 分类

从不同的角度,设备可以分为输入设备和输出设备;高速设备和低速设备;字符设备和块设备;随机访问和顺序访问设备;互斥使用和并发使用的设备。其中,字符设备即顺序访问设备,信息交换以字符为单位,是无结构、传输速率低、不可寻址的设备,如打印机、鼠标等。块设备即随机访问设备,其信息交换以块为单位,是有结构、传输速率较高、可寻址的设备,如磁盘等。

# 设备控制器 (I/O 接口)

设备控制器又叫 I/O 接口,其主要由以下三部分组成:

  1. 设备控制器与 CPU 的接口
  2. 设备控制器与设备的接口
  3. I/O 逻辑:用于实现对设备的控制。

# I/O 端口

I/O 端口是指设备控制器中可被 CPU 直接访问的寄存器。包括以下三类共四个:

  1. 数据寄存器:包括数据输入寄存器 (data-in register) 和数据输出寄存器 (data-out register)。分别用来暂时存储主机需要读入和写出的数据。
  2. 状态寄存器 (status register):包含一些主机可以读取的位,例如当前命令是否完成、数据输入寄存器中是否有数据可以读取、是否出现设备故障等。
  3. 控制寄存器 (control register):可由主机写入,以便启动命令或更改设备模式。

CPU 与 I/O 端口的通信包括两种方式:

  1. 独立编址
  2. 统一编址:又叫内存映射 I/O (memory-mapped I/O),即内存与 I/O 设备采用相同的地址空间。

# I/O 控制方式

I/O 控制方式包括轮询方式 (程序直接控制方式)、中断方式DMA 方式通道控制方式

# 轮询方式

# 中断方式

能够让设备通知 CPU 的硬件机制称为中断 (interrupt)。

采用中断驱动的 I/O 控制流程如下:

采用中断驱动的I/O控制流程

# DMA 方式

DMA 方式式的基本思想是在 I/O 设备和内存之间开辟直接的数据交换通路,彻底解放 CPU。DMA 方式的特点如下:

  1. 基本单位是数据块。
  2. 所传送的数据,是从设备直接送入内存的,或者相反。
  3. 仅在传送一个或多个数据块的开始和结束时,才需 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 中断和中断上半部处理.

# 大容量存储设备管理

# 磁盘调度算法