一步一步学linux操作系统: 28 输入与输出系统_输入与输出设备的管理

用设备控制器屏蔽设备差异

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操作系统
图片来自极客时间趣谈linux操作系统

用驱动程序屏蔽设备控制器差异

设备控制器不属于操作系统的一部分; 而驱动程序属于, 操作系统的内核代码可以像调用本地代码一样调用驱动程序的代码

统一的接口

对于操作系统其它部分的代码而言,设备驱动程序有统一的接口,从而无视不同设备的区别,以同样的接口调用设备驱动程序,中断处理也在驱动里完成

中断处理统一

操作系统要有一个统一的流程来处理中断,使得不同设备的中断使用统一的流程。驱动初始化时, 注册中断处理函数; 中断统一发出 do_IRQ, 其找到注册的中断处理函数并执行

图片来自极客时间趣谈linux操作系统
图片来自极客时间趣谈linux操作系统

对于块设备, 驱动与文件系统之间需要通用设备层; 通用设备层实现与块设备相关的通用逻辑, 维护与设备无关的块的大小,然后通用块层下面对接各种各样的驱动程序。

图片来自极客时间趣谈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操作系统

参考资料:

趣谈Linux操作系统(极客时间)链接:
http://gk.link/a/10iXZ
欢迎大家来一起交流学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值