用设备控制器屏蔽设备差异
I/O 设备多种多样, 通过设备控制器控制设备
CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit) 的组件,设备控制器有它的芯片,类似小 CPU,执行自己的逻辑。它也有它的寄存器。这样 CPU 就可以通过写这些寄存器,对控制器下发指令,通过读这些寄存器,查看控制器对于设备的操作状态
输入输出设备大致可以分为两类:块设备(Block Device) 和 字符设备(Character Device)。
- 块设备
块设备将信息存储在固定大小的块中,每个块都有自己的地址。硬盘就是常见的块设备。
块设备传输的数据量比较大,控制器里往往会有缓冲区 - 字符设备
字符设备发送或接收的是字节流。而不用考虑任何块结构,没有办法寻址。鼠标就是常见的字符设备。
CPU 如何同控制器的寄存器和数据缓冲区进行通信呢?
每个控制寄存器被分配一个 I/O 端口,可以通过特殊的汇编指令操作这些寄存器。
数据缓冲区,可内存映射 I/O,可以分配一段内存空间给它,就像读写内存一样读写数据缓冲区。
如何通知CPU,设备操作已完成
- 第一种方式 轮询等待
轮询检测控制器寄存器的状态标志位 - 第二种方式 中断
中断的方式通知操作系统输入输出操作已经完成。- 软中断
例如代码调用 INT 指令触发 - 硬件中断
硬件通过中断控制器触发
- 软中断
DMA 功能
设备需要读取或者写入大量数据,例如磁盘,需要支持DMA功能
允许设备在 CPU 不参与下, 自行完成内存读写; 由 DMA 协调控制磁盘控制器, 并发送中断通知 CPU 操作完成,CPU 只需要对 DMA 控制器下指令,说它想读取多少数据,放在内存的某个地方就可以了
图片来自极客时间趣谈linux操作系统
用驱动程序屏蔽设备控制器差异
设备控制器不属于操作系统的一部分; 而驱动程序属于, 操作系统的内核代码可以像调用本地代码一样调用驱动程序的代码
统一的接口
对于操作系统其它部分的代码而言,设备驱动程序有统一的接口,从而无视不同设备的区别,以同样的接口调用设备驱动程序,中断处理也在驱动里完成
中断处理统一
操作系统要有一个统一的流程来处理中断,使得不同设备的中断使用统一的流程。驱动初始化时, 注册中断处理函数; 中断统一发出 do_IRQ, 其找到注册的中断处理函数并执行
图片来自极客时间趣谈linux操作系统
对于块设备, 驱动与文件系统之间需要通用设备层; 通用设备层实现与块设备相关的通用逻辑, 维护与设备无关的块的大小,然后通用块层下面对接各种各样的驱动程序。
图片来自极客时间趣谈linux操作系统
用文件系统接口屏蔽驱动程序的差异
统一设备名称
所有设备都在 /dev/ 文件夹下面创建一个特殊的设备文件
特殊的设备文件也有 inode,但是它不关联存储介质上的数据,只建立与驱动的连接
硬盘设备
假设是 /dev/sdb,这是一个设备文件,和硬盘上的文件系统没有任何关系,也不对应硬盘上的任何一个文件。/dev/sdb 其实是在一个特殊的文件系统 devtmpfs 中。
当我们将 /dev/sdb 格式化成一个文件系统 ext4 的时候,会将它 mount 到一个路径下面,例如在 /mnt/sdb 下面。/dev/sdb 还是一个设备文件在特殊文件系统 devtmpfs 中,而 /mnt/sdb 下面的文件才是在 ext4 文件系统中,只不过这个设备是在 /dev/sdb 设备上的
添加新设备
需要安装驱动( Linux 中即加载一个内核模块 ), 用 lsmod 查看加载的内核模块, 可通过 insmod 安装; 有了驱动, 可用 mkmod 在 /dev/ 下创建设备文件.
lsmod
# lsmod
Module Size Used by
iptable_filter 12810 1
bridge 146976 1 br_netfilter
vfat 17461 0
fat 65950 1 vfat
ext4 571716 1
cirrus 24383 1
crct10dif_pclmul 14307 0
crct10dif_common 12595 1 crct10dif_pclmul
insmod
加载 openvswitch 的驱动
insmod openvswitch.ko
mknod
mknod filename type major minor
filename 就是 /dev 下面的设备名称,type 就是 c 为字符设备,b 为块设备,major 就是主设备号,minor 就是次设备号
有了文件系统接口之后,不但可以通过文件系统的命令行操作设备,也可以通过程序,调用 read、write 函数,像读写文件一样操作设备
对于设备来讲,还有一种接口称为 ioctl,表示输入输出控制接口,用于配置和修改特定设备属性的通用接口,实现读写很难完成的操作
总结
输入输出设备就像管理代理商一样。因为代理商复杂多变,代理商管理也同样复杂多变,需要层层屏蔽差异化的部分,给上层提供标准化的部分,最终到用户态,给用户提供了基于文件系统的统一的接口。
图片来自极客时间趣谈linux操作系统
参考资料:
趣谈Linux操作系统(极客时间)链接:
http://gk.link/a/10iXZ
欢迎大家来一起交流学习