摘要
- 设备控制器
- IO控制方式
- 设备驱动程序
- 存储系统IO分层
设备控制器
为什么需要设备控制器?
电脑可以外接很多设备,如键盘、鼠标、硬盘、显示器、网卡等,每个设备的用法和功能不同,操作系统为了对这些输入输出设备进行统一管理,必须要屏蔽设备之间的差异,因此需要设备控制器。
设备控制器的特点?
- 设备控制器必须要清楚的知道设备的用法和功能,这样CPU可以通过和设备控制器交互来控制设备。
- 设备寄存器里面含有芯片,可以执行自己的逻辑
- 设备寄存器里面有寄存器,用来与CPU进行通信
设备控制器中寄存器的作用?
- 通过写入寄存器,操作系统可以让设备发送数据、接收数据、开启或关闭,或者执行某些其他操作
- 通过读取寄存器,操作系统可以了解设备的状态,是否准备好接收一个新的指令等
设备控制器中寄存器的种类有哪些?
- 数据寄存器:CPU向IO设备写入需要传输的数据
- 命令寄存器:CPU发送一个命令,告诉IO设备要进行输入输出操作,于是就会交给IO设备去工作,任务完成以后,会把状态寄存器里面的状态标记为已完成。
- 状态寄存器:目的是告诉CPU,现在的工作已完成或者在进行中,如果是在进行中状态,CPU再发送数据和指令过来都是无用的,直到工作完成,状态寄存器修改为已完成,CPU发送的数据和指令才能被处理
输入输出设备大体分为哪几类?
- 块设备:把数据存储在固定的块中,每个块都有自己的地址,比如磁盘、USB都是常见的块设备
- 字符设备:以字符为单位发送或接收一个字符流,字符设备不可寻址,没有寻道操作,比如鼠标
设备控制器中数据缓冲区的作用?
块设备传输的数据量往往比较大,为了减少对设备的频繁操作,需要借助数据缓冲区:
- CPU写入数据到控制器的缓冲区,等积累到一定的量时,再发送给设备
- CPU从控制器的缓冲区读入数据时,也需要等缓冲区积累到一定的量时,才拷贝到内存
CPU和设备控制器的通信方式有哪几种?
- 端口IO:每个控制寄存器被分配一个IO端口,可以通过特殊的汇编指令操作这些寄存器,比如in/out类的指令
- 内存映射IO:将所有的控制寄存器映射到内存空间,这样可以像读写内存一样读写数据缓冲区
IO控制方式
设备控制器读取完数据后,如何通知CPU?
- CPU自己轮询
- 中断
- DMA控制器
CPU自己轮询的缺点?
CPU需要一直查询控制器中寄存器的状态,直到寄存器的状态变为已完成,这种方式会占用大量的CPU时间
中断的缺点?
中断虽然能解决轮询的缺点,但对于频繁读写磁盘并不友好,因为这样CPU会经常性被打断,占用了大量的CPU时间。
什么是DMA?
DMA可以使得设备在CPU不参与的情况下,能够自行将IO数据放入内存,实现DMA必须要有DMA控制器硬件的支持。
DMA控制器的工作方式?
- CPU对DMA控制器下发指令,告诉它需要读取多少数据,读取的数据放在内存的哪个位置
- DMA控制器向磁盘控制器下发指令,通知磁盘控制器读取数据到其内部缓冲区域
- 接着磁盘控制器将缓冲区域的数据传输到内存
- 传输操作完成以后,磁盘控制器在总线上发送一个确认成功的信号到DMA控制器
- DMA控制器收到信号以后,发送中断通知给CPU,CPU就可以利用内存中的数据了
设备驱动程序
为什么需要设备驱动程序?
设备控制器虽然屏蔽了设备的细节,但每种设备控制器的寄存器、缓冲区等的使用模式不同,因此引入了设备驱动程序屏蔽设备控制器的差异。
设备控制器属于硬件范畴,但设备驱动程序属于操作系统的一部分。操作系统的内核代码可以像本地调用一样使用驱动程序的接口。
驱动程序处理中断
设备控制器在完成任务以后,会发出中断信号,此时CPU收到中断指令以后,往往会对中断进行响应,而响应的处理函数往往在驱动程序中,因此驱动程序初始化的时候,要先注册一个该设备的中断处理函数。
中断处理流程
- 设备控制器准备好数据时,会通过中断控制器向CPU发出中断请求
- CPU响应中断请求,保存当前进程的上下文信息
- 转入响应的中断函数处理函数
- 进行中断处理
- 中断处理完成以后,恢复被中断进程的上下文
存储系统IO分层
Linux的存储系统的IO由上到下可以分为三个层次,分别是:
- 文件系统层
- 通用块层
- 设备层
- 文件系统层:包括虚拟文件系统和其他文件系统的具体实现,向上为应用程序统一提供了标准的文件访问接口,向下会通过通用块层来存储和管理磁盘数据
- 通用块层:包括块设备的IO队列和IO调度器,它对文件系统的IO请求进行排队,再通过IO调度器,选择一个IO发给下层的设备层
- 设备层:包括硬件设备、设备控制器和驱动程序,负责物理设备的IO