输入与输出
用设备控制器屏蔽设备差异
- I/O 设备多种多样, 通过设备控制器范文设备( 类似代理商 )
- 控制器像小电脑, 有芯片和寄存器, CPU 可通过读写寄存器访问设备
- I/O 设备可分为两类:
- 块设备:将信息存储在固定大小的块中,每个块都有自己的地址。硬盘就是常见的块设备。
- 字符设备:发送或接受的是字节流。而不用考虑任何块结构,没有办法寻址。鼠标就是常见的字符设备。
- CPU 如何同控制器的寄存器和数据缓冲区进行通信呢? 块设备控制器有缓冲区, 数据缓冲区即内存映射 I/O; 控制器寄存器有 I/O 端口, 可通过汇编指令操作.
- 如何通知设备操作已完成:
- 轮询等待控制器寄存器的状态标志位 :一直查询,直到完成 (不好)
- 中断通知, 通过硬件中断控制器通知 CPU(硬件中断); ( 而软中断是在代码中调用 INT, 可触发系统调用 )

- DMA 功能, 设备在 CPU 不参与下, 自行完成内存读写; 由 DMA 协调控制磁盘控制器, 并发送中断通知 CPU 操作完成。

驱动程序屏蔽设备控制器差异
- 设备控制器不属于操作系统的一部分; 而驱动程序属于, 可以被内核代码调用.
- 驱动程序应有统一的接口, 中断处理也在驱动里完成
- 中断的处理流程:驱动初始化时, 注册中断处理函数; 中断统一出发
do_IRQ, 其找到注册的中断处理函数并执行进行中断。

- 对于块设备, 驱动与文件系统之间需要通用设备层; 通用设备层实现与块设备相关的通用逻辑, 位于与设备无关的操作
用文件系统接口屏蔽驱动程序的差异
- 设备驱动程序是用来对接设备控制器的,中断处理也应该在设备驱动里面完成。
- 统一设备名称, 设备在
/dev/ 下有特殊设备文件, 其有 inode 但不关联存储介质数据, 只建立与驱动的连接; /dev/ 是在 devtmpfs 文件系统下, c→字符设备文件, b→块设备文件; 设备号: 主设备号(驱动程序), 次设备号(相应的单元); 可对设备文件使用文件的操作命令
- 添加新设备, 需要安装驱动( Linux 中即加载一个内核模块 ), 用 lsmod 查看加载的内核模块, 可通过 insmod 安装; 有了驱动, 可用 mkmod 在 /dev/ 下创建设备文件.
lsmod -- 查看驱动
insmod xx.ko -- 加载驱动
mknod filename type major minor -- 创建设备文件 type 就是 c 为字符设备,b 为块设备 major 就是主设备号,minor 就是次设备号
- 或 /sys/sysfs 中是实际设备数的反映
- /sys/devices 所有设备层次结构
- /sys/dev char block 中用设备号链接到 /sys/devices 中
- /sys/block 所有块设备
- 守护进程 udev
- 内核检测到新设备插入, 或创建 kobject 对象, 通过 sysfs 展现给用户, 并发送热插拔消息, udev 监听到消息并在 /dev/ 中创建设备文件
- ioctl 可用于配置和修改设备信息.

总结
最终到用户态,给用户提供了基于文件系统的统一的接口。

字符设备