- 用设备控制器屏蔽设备差异
- I/O 设备多种多样, 通过设备控制器范文设备( 类似代理商 )
- 控制器像小电脑, 有芯片和寄存器, CPU 可通过读写寄存器访问设备
- I/O 设备可分为两类: 块设备, 信息存于块中, 有自己的地址, 例如硬盘; 字符设备, 信息为字节流, 无法寻址, 例如鼠标.
- 块设备控制器有缓冲区, 数据缓冲区即内存映射 I/O; 控制器寄存器有 I/O 端口, 可通过汇编指令操作.
- 如何通知设备操作已完成:
- 轮询检测控制器寄存器的状态标志位
- 中断通知, 通过硬件中断控制器通知 CPU; ( 而软中断是在代码中调用 INT, 可触发系统调用 )
- DMA 功能, 设备在 CPU 不参与下, 自行完成内存读写; 由 DMA 协调控制磁盘控制器, 并发送中断通知 CPU 操作完成
- 驱动程序屏蔽设备控制器差异
- 设备控制器不属于操作系统的一部分; 而驱动程序属于, 可以被内核代码调用.
- 驱动程序应有统一的接口, 中断处理也在驱动里完成
- 驱动初始化时, 注册中断处理函数; 中断统一出发 do_IRQ, 其找到注册的中断处理函数并执行
- 对于块设备, 驱动与文件系统之间需要通用设备层; 通用设备层实现与块设备相关的通用逻辑, 位于与设备无关的操作
- 用文件系统接口屏蔽驱动程序的差异
- 统一设备名称, 设备在 /dev/ 下有特殊设备文件, 其有 inode 但不关联存储介质数据, 只建立与驱动的连接; /dev/ 是在 devtmpfs 文件系统下, c→字符设备文件, b→块设备文件; 设备号: 主设备号(驱动程序), 次设备号(相应的单元); 可对设备文件使用文件的操作命令
- 添加新设备, 需要安装驱动( Linux 中即加载一个内核模块 ), 用 lsmod 查看加载的内核模块, 可通过 insmod 安装; 有了驱动, 可用 mkmod 在 /dev/ 下创建设备文件.
- 或 /sys/sysfs 中是实际设备数的反映
- /sys/devices 所有设备层次结构
- /sys/dev char block 中用设备号链接到 /sys/devices 中
- /sys/block 所有块设备
- 守护进程 udev
- 内核检测到新设备插入, 或创建 kobject 对象, 通过 sysfs 展现给用户, 并发送热插拔消息, udev 监听到消息并在 /dev/ 中创建设备文件
- ioctl 可用于配置和修改设备信息.
展开