设备控制器与驱动程序
复习
- 工作集与内存抖动:程序频繁缺页时为什么会忙着换页却不再做事
- 写时复制:先共享页面,真正修改时再复制
- 内存分配与碎片:操作系统怎样切分、回收和整理内存
TL;DR
- 设备五花八门,接口、速度、控制方式全不一样
- 设备控制器:设备一侧的“处理器”,负责具体地操控硬件
- 驱动程序:内核里的一段代码,把标准请求翻译成该设备能懂的命令
- 两者配合,用统一接口把硬件差异藏起来
正文
内存这条线告一段落。接下来,程序要和外界打交道:键盘、屏幕、硬盘、网卡……可这些设备千差万别,操作系统怎么统一地“使唤”它们?
设备这一侧:控制器
先看设备本身。现代设备一般不是“裸”的,它带一个小小的设备控制器(device controller)。
- 控制器是设备一侧的“小处理器”,真正懂得怎么驱动硬件
- 键盘控制器知道怎么扫描按键,硬盘控制器知道怎么读写盘片
- CPU 并不直接和硬件的电信号打交道,而是和控制器打交道
也就是说,CPU 下达的是“给我读这个扇区”这类较高级的命令,具体怎么在盘片上找、怎么转、怎么读,由控制器自己完成。
内核这一侧:驱动程序
CPU 这一侧,也得有个“翻译”。不同控制器的寄存器、命令格式各不相同,如果每个程序都自己处理,简直就是灾难。
于是内核里为每类设备准备一段代码,叫驱动程序(device driver):
- 它知道这个设备怎么发命令、怎么查状态、怎么取数据
- 它把内核的统一请求(比如“读”),翻译成该设备能懂的具体操作
- 对上层,它只暴露标准的接口
统一接口
有了控制器和驱动,操作系统就能对上层提供一个统一接口。程序只要调用“读”“写”“打开”这样的通用操作,不必关心底下是哪种设备:
程序:read(某个设备, 数据)
│
▼
内核统一接口
│
▼
相应设备的驱动程序 ──> 设备控制器 ──> 硬件
硬盘、键盘、网卡,在程序眼里都可以“读”和“写”,尽管它们的内部天差地别。又是加一层:用统一的抽象,罩住混乱的硬件。
那么,一次具体的读写,CPU 和控制器是怎么配合完成的?下一章,我们看三种越来越省事的配合方式。
思考题
设备控制器和驱动程序,一个在设备里,一个在内核里。为什么这个“翻译”工作要拆成两半?只留一半行不行?
小结
知识点
- 设备控制器:设备一侧操控硬件的“小处理器”
- 驱动程序:内核里翻译标准请求的代码
- 统一接口隐藏设备差异
- CPU 通过控制器与驱动访问设备
参考资料
- Wikipedia(zh):设备控制器:device controller
- Wikipedia(zh):驱动程序:device driver
思考题答案(仅供参考)
因为两侧关心的东西不同:控制器贴近硬件,负责时序、电气和机械细节,这些是每种硬件独有的,只能由硬件厂商来实现;驱动贴近操作系统,负责把统一的请求翻译成该控制器的命令,还得融入内核的资源管理和错误处理。如果把翻译全塞进设备,设备就得懂操作系统的内部规矩,很难通用;全塞进内核,内核又得为每种硬件写不同代码,不堪重负。分成两半,各自管好自己那一层,才能既通用又可行。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪