Appearance
题目
下列关于驱动程序的描述中,错误的是( )。
错因
A
把这条说法当作错误。但它其实是驱动程序最准确的角色定义——向上给 OS(具体是设备无关 I/O 软件层)暴露统一接口,向下直接和硬件控制器(寄存器、中断)打交道。这是教材标准说法,无可争议。
B
误以为这条错。但每种硬件的寄存器布局、中断号、初始化时序、命令字格式都不一样,驱动必须针对特定硬件型号编写——这就是 Linux 内核里有几千个 .c 文件分别对应不同设备驱动的原因。这条是对的,不是错的。
C
被两条看似矛盾的说法搞糊涂——"既要定制开发,又要统一接口?"实际上这两条恰好是分工:对下定制(贴硬件)、对上统一(向 OS 暴露 read / write / open / close 等标准函数)。统一接口正是"设备无关性"的实现基础——上层 OS 才能用同一套系统调用操作五花八门的设备。这条是对的。
总解析
题面是反向措辞:"错误的是( )"——找的是错的那个。
分析四个论断:
| 选项 | 内容 | 对错 | 理由 |
|---|---|---|---|
| A | 驱动是硬件与 OS 的接口程序 | 对 | 教材定义;是连接 OS 抽象层和具体硬件寄存器的桥梁 |
| B | 驱动需根据硬件特性定制开发 | 对 | 不同硬件寄存器布局、中断号、命令字都不同,必须一对一编写 |
| C | 驱动需要设置统一的接口 | 对 | 向上必须提供统一的 read/write/ioctl 等接口,让 OS 屏蔽设备差异 |
| D | 字符设备、块设备都是同一种 I/O 方式 | 错 | 二者是 OS 划分的不同设备类,I/O 方式根本不同 |
字符设备 vs 块设备 的本质区别:
| 维度 | 字符设备 | 块设备 |
|---|---|---|
| 访问粒度 | 按字节流式访问 | 按块(如 512 B / 4 KB)随机访问 |
| 缓冲方式 | 通常无缓冲或简单缓冲 | 有专门的块缓存(buffer cache / page cache) |
| 是否可寻址 | 不可(流式,只能顺序读写) | 可(任意 LBA 跳转) |
| 典型设备 | 键盘、鼠标、串口、终端 | 磁盘、SSD、光盘、U 盘 |
| 系统调用语义 | 一次返回任意字节数 | 一次必读/写一整块 |
正因为这两类设备的访问模式完全不同,OS 在 I/O 子系统里给它们设了两条独立的处理路径(Linux 里就是 chrdev 和 blkdev 两套子系统)——绝不是"同一种 I/O 方式"。D 是错的。
最终答案(错误的描述)是 D。