设备管理
设备控制器 Device Control
控制器:设备配套的软件,向外提供使用设备的接口,屏蔽设备之间的差异。
通过读写控制器的寄存器,CPU可以与之通信、获取状态等。常见的控制器寄存器有三种:状态、命令、数据 寄存器。CPU通过读写控制器操控设备
块设备和字符设备
设备可分为:块设备和字符设备
- 块设备在固定大小的块中存储数据,有地址,如磁盘、USB
- 而字符设备以字符为单位接受或发送字符流,不可寻址、无寻道操作,如鼠标
为了减少块设备的I/O次数,控制器设立了一个数据缓冲区:
- 读写数据时,只有数据量达到了一定数目才会发给设备或内存
CPU与控制寄存器、缓冲区交互
主要分为两种方式:
- PMIO:端口映射 I/O,CPU使用专用的I/O指令,以及独立的I/O地址空间
- MMIO:内存映射I/O,将设备寄存器和缓冲区映射到内存地址空间中,CPU可以像读写普通内存一样访问设备
I/O 控制
中断:通知CPU
当设备读取完数据时,会触发中断发送到中断控制器,中断控制器通知CPU从而产生中断。这是硬件中断,另一种中断是软件设置的,称为 软中断
如果设备频繁产生数据,大量的中断会耗费大量的时间:
- 大量中断产生的上下文切换开销极大
- 需要CPU参与,由它将数据从I/O缓冲区逐字节复制到内存
DMA:加速设备数据读取
DMA 无需CPU参与,一次传输的数据量大,只在最终传输完毕数据时通过中断通知CPU,从而提高数据传输速度、减少终端、以及与CPU并行运行
其基本工作流程是:
- CPU 告知 DMA 控制器想从哪个设备读取多少数据,放在内存的哪个地址
- DMA 控制器与设备交互,绕过CPU进行数据的传输
- 传输完毕后发出中断通知CPU
驱动程序
进一步屏蔽不同设备缓冲区、寄存器的使用方式差异,属于OS软件,负责操纵设备控制器。内核可调用相应的代码接口
在产生中断时,OS调用相应的设备 handler
通用块
屏蔽块设备差异,使用通用块抽象管理不同的块设备,是FS与驱动程序之间的一层。它的主要职责是屏蔽块设备差异,以及进行对请求进行I/O调度
存储系统 I/O分层
可以认为:vfs>fs>块>驱动程序>硬件设备
键盘敲入字母
- 键盘输入,键盘控制器检测到事件,将其转换为扫描码放到数据寄存器
- 发送中断信号到CPU,CPU调用驱动程序注册的 handler
- handler 读取扫描码,转换为具体的字符存储到内存中的键盘缓冲区
- 显示设备的驱动程序会定时从缓冲区中读取数据写入到显示设备的控制器寄存器中,最后显示