Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

设备控制器与驱动程序

复习

  • 工作集与内存抖动:程序频繁缺页时为什么会忙着换页却不再做事
  • 写时复制:先共享页面,真正修改时再复制
  • 内存分配与碎片:操作系统怎样切分、回收和整理内存

TL;DR

  • 设备五花八门,接口、速度、控制方式全不一样
  • 设备控制器:设备一侧的“处理器”,负责具体地操控硬件
  • 驱动程序:内核里的一段代码,把标准请求翻译成该设备能懂的命令
  • 两者配合,用统一接口把硬件差异藏起来

正文

  内存这条线告一段落。接下来,程序要和外界打交道:键盘、屏幕、硬盘、网卡……可这些设备千差万别,操作系统怎么统一地“使唤”它们?

设备这一侧:控制器

  先看设备本身。现代设备一般不是“裸”的,它带一个小小的设备控制器(device controller)。

  • 控制器是设备一侧的“小处理器”,真正懂得怎么驱动硬件
  • 键盘控制器知道怎么扫描按键,硬盘控制器知道怎么读写盘片
  • CPU 并不直接和硬件的电信号打交道,而是和控制器打交道

  也就是说,CPU 下达的是“给我读这个扇区”这类较高级的命令,具体怎么在盘片上找、怎么转、怎么读,由控制器自己完成。

内核这一侧:驱动程序

  CPU 这一侧,也得有个“翻译”。不同控制器的寄存器、命令格式各不相同,如果每个程序都自己处理,简直就是灾难。

  于是内核里为每类设备准备一段代码,叫驱动程序(device driver):

  • 它知道这个设备怎么发命令、怎么查状态、怎么取数据
  • 它把内核的统一请求(比如“读”),翻译成该设备能懂的具体操作
  • 对上层,它只暴露标准的接口

统一接口

  有了控制器和驱动,操作系统就能对上层提供一个统一接口。程序只要调用“读”“写”“打开”这样的通用操作,不必关心底下是哪种设备:

程序:read(某个设备, 数据)
        │
        ▼
内核统一接口
        │
        ▼
相应设备的驱动程序 ──> 设备控制器 ──> 硬件

  硬盘、键盘、网卡,在程序眼里都可以“读”和“写”,尽管它们的内部天差地别。又是加一层:用统一的抽象,罩住混乱的硬件。

  那么,一次具体的读写,CPU 和控制器是怎么配合完成的?下一章,我们看三种越来越省事的配合方式。

思考题

  设备控制器和驱动程序,一个在设备里,一个在内核里。为什么这个“翻译”工作要拆成两半?只留一半行不行?

小结

知识点

  • 设备控制器:设备一侧操控硬件的“小处理器”
  • 驱动程序:内核里翻译标准请求的代码
  • 统一接口隐藏设备差异
  • CPU 通过控制器与驱动访问设备

参考资料

  1. Wikipedia(zh):设备控制器:device controller
  2. Wikipedia(zh):驱动程序:device driver

思考题答案(仅供参考)

  因为两侧关心的东西不同:控制器贴近硬件,负责时序、电气和机械细节,这些是每种硬件独有的,只能由硬件厂商来实现;驱动贴近操作系统,负责把统一的请求翻译成该控制器的命令,还得融入内核的资源管理和错误处理。如果把翻译全塞进设备,设备就得懂操作系统的内部规矩,很难通用;全塞进内核,内核又得为每种硬件写不同代码,不堪重负。分成两半,各自管好自己那一层,才能既通用又可行。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪