外设管理

目的

  • 提高效率:通过缓存等机制,匹配CPU的速度
  • 方便用户:统一了繁多的外设,提供了统一的访问方法
  • 方便控制:方便OS对外设的控制

功能

  • 提供接口
  • 设备的分配、释放
  • 设备的访问、控制
  • I/O缓存和调度

    设备的分配和释放是逻辑I/O,实际上与设备无关
    设备的访问和控制通过设备驱动程序完成,是真正的I/O

控制方式

对外设的控制是通过外设提供的控制器进行的,包括控制寄存器、状态寄存器、以及一些数据的寄存器。
通过读写这些寄存器我们就实现了对外设的控制

I/O分类

数据组织

  • 块设备:以数据块为单位存储、传输信息。传输速率高,可随机读写
  • 字符设备:以字符为单位存储、传输信息。传输速率低,不可随机读写

用途

  • 存储设备
  • 传输设备
  • 人机交互设备

资源分配

  • 独占设备:同时只能由一个设备访问
  • 共享设备:同时允许多个设备访问
  • 虚设备:在一类设备上模拟另一类设备

设备控制器

图示

设备控制器

功能

  • 接受和识别CPU指令
  • 数据交换:CPU与控制器、控制器与设备
  • 设备状态的了解和报告
  • 设备地址识别
  • 缓冲区
  • 对设备传来的数据进行差错检测

I/O硬件组成

  • 控制器与CPU接口:数据寄存器、控制寄存器、状态寄存器
  • 控制器与设备接口:数据信号、控制信号、状态信号
  • I/O逻辑:用于实现CPU对I/O设备的控制

设备控制器组成

设备控制器是一个硬件

I/O地址映射方式

  • 内存映像编址:控制器的内存/寄存器作为物理内存空间的一部分
  • I/O独立编址:I/O的地址为新的空间的一部分

    内存映像编址让其可以通过正常的所有指令访问I/O设备,因为地位相同
    I/O独立编址让其只能通过特殊的访问指令来访问I/O设备,因为地位不同

I/O控制方式

  • 程序控制:缺乏硬件支持的程序只能通过不断询问外设状态的忙等方式来等待I/O结束
    软件控制
  • 中断驱动:当I/O操作结束后由设备控制器主动地来通知设备驱动程序说这次结束,以中断的方式
    中断驱动
  • DMA: 直接存储器访问方式,通俗的说就是由专门的控制器来完成内存和外设之间的数据传输工作
    DMA
  • 通道:极其类似于DMA,虽然叫通道,但是一种处理器,来完成内存和外设之间的数据传输工作,接管CPU的部分权限更多一点
    IO通道

    通道分类

  • 字节多路通道:以字节为单位在多个设备之间交叉工作,这边取一个字节,换个设备再取一个
  • 数组选择通道:每次针对一个设备传送一批数据,只能一个个处理设备的传输请求。
  • 数组多路通道:前两者的聚合。

    通道强于DMA的一点就是,一个DMA配一个设备,而一个通道可以同时服务好几个设备。

I/O软件设计

特点

分层设计

分层设计,上层注重提供统一接口,下层注重与硬件的对接

设备独立性

上层请求设备逻辑设备名字,由软件对应物理设备名字。

实现结构

设备逻辑表:为了实现设备的独立性,系统必须设置一张逻辑设备表LUT(Logical Unit Table),用于将应用程序中所使用的逻辑设备名映射为物理设备名。
该表的每个表目中包含了三项,逻辑设备名、物理设备名、设备驱动程序的入口地址。通过逻辑设备名,系统可以查找LUT,便可找到物理设备和驱动程序。
LUT

这里很像物理和逻辑地址之间的映射,但比较简单,通过LUT就可以完成。

驱动程序

定位

  • 与设备密切相关的代码放在设备驱动程序中,每个设备驱动程序处理一种设备类型。
  • 设备驱动程序的任务是接收来自与设备无关的上层软件的抽象请求,并执行这个请求。
  • 每一个控制器都设有一个或多个设备寄存器,用来存放向设备发送的命令和参数。设备驱动程序负责释放这些命令,并监督它们正确执行

    由于密切相关,所以驱动程序只能由设备生产商维护,不能由通用性的操作系统来维护。
    除此之外,控制器不是设备自带的,是主板上内置的,驱动程序通过按照规律通过控制器发射信号来与设备交互。

    组成

    程序层
  • 自动配置和初始化子程序。
  • I/O操作子程序
  • 中断服务子程序
    函数层
  • 驱动程序初始化函数、驱动函数卸载函数、申请设备函数、卸载设备函数
  • I/O操作函数
  • 中断处理函数

    特性

  • 动态可加载:内核对驱动程序召之即来,挥之即去。
  • 无害性:即使这个驱动程序不服务于任何外设,也对系统无害

I/O缓冲管理

单缓冲

只有一个缓冲区,只有缓冲区内的数据被读取完毕后,I/O设备才能继续向缓冲区放入数据,所以CPU从缓冲区读出数据和I/O设备向缓冲区写入数据不能并行。
单缓冲

双缓冲

有两个缓冲区,I/O设备塞满一个缓冲区后,可以切换到下一个缓冲区继续塞,此时CPU可以从原来的缓冲区读出数据,实现了CPU从缓冲区读出数据和I/O设备向缓冲区写入数据并行。
双缓冲

仔细思考一下这里,只有读出和读入速度差不多,两个缓冲区才刚刚好。

多缓冲

有很多缓冲区,为了切换方便组成了环形。
一般有三个指针,第一个指向下一个空缓冲,第二个指向下一个满的缓冲,第三个指向目前CPU正在读出的缓冲区。
环形缓冲

缓冲池

前面的听起来都很好,但是是对于某一个进程的,如果进程很多,开很多的循环缓冲的话,会很占用空间,这就引入了缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。

管理方式

将相同状态的缓冲区链接成队列。
缓冲池

工作模式

工作模式

  • 收容输入
  • 提取输入
  • 收容输出
  • 提取输出

I/O设备分配

背景

面对很多的进程,I/O设备总是有限的,同样需要进行分配。

做法

  • 进程轮流使用外设:键盘、鼠标

    实现

    数据结构
  1. 设备控制表:一个设备一张,描述设备的特性和状态
    设备控制表
  2. 控制器控制表:一个控制器一张,描述I/O控制器的配置和状态。
    控制器控制表
  3. 通道控制表:一个通道一张,描述通道工作状态。
    通道控制表
  4. 系统设备表:一个系统一张,反映设备资源的状态及其设备控制表的入口。
    系统设备表
    分配方法
    设备分配方法
  • 通过一个虚拟设备来将外设与应用进程隔开、只由虚拟设备来使用设备

    实现

    SPOOLing技术:应用程序进行I/O操作时,只是和SPOOLing程序交换数据,可以称为“虚拟I/O”。应用程序实际上是从SPOOLing程序的缓冲池中读出数据或把数据送入缓冲池,而不是跟实际的外设进行I/O操作。
    Spooling

I/O操作

过程

  1. 磁盘把数据装载进内核的内存空间
  2. 内核的内存空间的数据copy到用户的内存空间

    实现方式

    五模型.png