一、I/O 管理子系统的五个层次
1.用户层 I/O 软件
- (1)即应用程序与设备 I/O 相关的部分。
2、设备独立性软件
- (1)用于实现用户程序与设备驱动程序的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和设备传输提供必要的存储空间。
- (2)主要功能
- ①向用户层提供统一的接口,如 read()/write()。
- ②执行所有设备的公共操作,包括对设备的分配与回收、将逻辑名映射成物理设备名、对设 备进行保护、禁止用户直接访问设备、缓存管理、差错控制、提供独立于设备的大小统一 的逻辑块、屏蔽设备之间信息交换单位大小和传输速率的差异。
3、设备驱动程序
- (1)硬件相关,具体实现 OS 对设备发出的操作指令,驱动 I/O 设备工作,通常以进程形式存在。
- (2)每一类设备有一个设备驱动程序,比如 U 盘这一类设备就有一个设备驱动程序。
4、中断处理程序
- (1)进行上下文任务的切换、测试中断信号、读取设备状态、修改进程状态。
- (2)通常以进程形式工作。
5、硬件
- (1)分为机械部分和电子部分。
- (2)机械部分:设备本身。
- (3)电子部分:设备控制器,也称适配器。
- ①通常是印刷电路板,通过插入主板进行工作,其中包含有寄存器,通过寄存器与 CPU 通 信。
- ②这些寄存器要收编到内存地址空间,就是内存映像 I/O,统一编制。也有的是 I/O 专用地址,称为独立编址。
- ③设备控制器是一种抽象的概念,具体实施中,有程序直接控制、中断驱动方式、DMA、通道。
二、DMA(直接存储器访问)
1.什么是 DMA
- (1)DMA 技术使得外围设备可以通过 DMA 控制器直接访问内存,与此同时 CPU 可以继续 执行程序。(一旦配置完成后无须cpu直接干预)
2.DAM 过程
- (1)请求:CPU 对 DMA 控制器初始化后,向 I/O 接口发出操作指令,I/O 接口提出 DMA 请 求
- (2)响应:
- ①DMA控制器对DMA请求进行优先级判别及屏蔽,向总线裁决逻辑提出总线请求。
- ②当CPU执行完当前总线周期即可释放总线控制权,此时总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知 I/O接口开始DMA传输。
- (3)传输
- ①DMA 控制器获得总线控制权后,CPU 即刻挂起或只执行内部操作,由 DMA 控制器输出读 写命令,直接控制 RAM 与 I/O 接口进行 DMA 传输。
- ②在 DMA 控制器的控制下,存储器与外设直接进行数据传输,不需要 CPU 的参与,开始时 需要提供传输的数据起始位置和和数据长度。
- (4)结束
- ①完成数据传输后,DMA 释放总线控制权,并向 I/O 接口发出结束信号。
- ②I/O 接口收到结束信号后,一方面停止 I/O 设备的工作,另一方面向 CPU 提出中断请求, 使 CPU 从不介入状态解脱,并执行一段检查本次 DMA 传输操作正确性的代码,最后带着 本次操作结果及状态继续执行原来的程序。
三、中断
1、什么是中断的上下部
- (1)两个原因:
- ①中断处理程序处于中断上下文,而中断上下文是不参与调度的,所以中断上下文不能出现 可能睡眠的操作,因为一旦睡眠就回不来了。这也就决定了中断不能和用户空间进行数据 交互,因为这种交互可能会引起睡眠。
- ②为了尽量提高系统的响应速度,中断程序运行的时间应该尽可能短。
- (2)有些中断处理没能很快处理完,于是 Linux 内核提供中断上下部。上半部就是中断处 理函数,它能最快地响应中断,并且做一些必须在中断响应之后马上要做的事情,而 一些需要在中断处理函数后继续执行的操作,内核建议把它放在下半部执行。
- (3)中断的下半部有两种实现方式:tasklet(小任务)、workqueue(工作队列)。:
- ①tasklet 也工作在中断上下文,只是在执行完上半部之后不会立即执行下半部,此时的空隙 可以被系统调度,但一旦执行了下半部就不能被系统调度了。
- ②workqueue 则工作在进程上下文,进程上下文是可以被调度的。
2、中断上下部的适用场景
- (1)必须立即进行紧急处理的极少量任务放在中断的顶半部中。此时屏蔽了与自己同类型 的中断,可以迅速不受打扰地完成紧急任务。
- (2)急迫的需要较少量时间的中等数量的任务放在 tasklet 中。此时不会屏蔽任何中断(包 括与自己顶半部同类型的中断),所以不影响顶半部对紧急事务的处理;同时又不会进 行用户进程调度,从而保证了自己急迫的任务得以完成。
- (3)不紧迫的需要较多时间的大量任务放在 workqueue 中。此时操作系统会尽快处理这个 任务,但如果任务量太大,期间也会调度别的用户进程运行,从而保证不会因为这个 任务而导致其他用户进程无法推进。
- (4)可能引起睡眠的任务放在 workqueue 中。因为在 workqueue 中睡眠是安全的,在需要 获得大量内存时、在需要获取信号量时、在需要进行阻塞式的 I/O 操作时,用 workqueue 很合适。