技术知识库

misc 设备为什么称为杂项设备

misc 设备为什么称为杂项设备

摘要

misc 是 miscellaneous 的缩写,意思是“杂项”。misc 设备仍然属于字符设备,只是把一些规模较小、彼此没有统一业务类别、又没有必要各自申请主设备号的驱动集中到同一个注册框架中。Linux 5.0 的 misc 框架共用固定主设备号 10,用不同的次设备号区分具体设备。

问题/背景

普通字符设备实验需要显式处理设备号、cdev、class 和 device;misc 实验只需要定义 struct miscdevice 并调用 misc_register()。需要理解这种简化来自哪里,以及“misc”是否代表一种不同于字符设备的新设备类型。

核心机制

misc 仍然是字符设备

用户空间仍通过标准字符设备接口访问它:

open → read/write/ioctl → struct file_operations

区别主要在注册和公共管理层,而不是数据读写模型。

为什么叫“杂项”

许多小型控制设备、虚拟设备或简单硬件接口不适合归入 tty、input、block 等成熟子系统,也没有必要独占一个主设备号。misc 框架把这些相互无关的字符设备收纳到一个公共入口,所以称为“杂项设备”。

“杂项”描述的是分类方式,不表示设备不重要、实现混乱或功能不确定。

主设备号固定为 10

Linux 5.0 定义:

#define MISC_MAJOR 10

misc 框架自身注册主设备号 10。每个具体 misc 驱动只需要提供次设备号、名称和 file_operations:

static struct miscdevice misc_mailbox_device = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = "misc_mailbox",
	.fops = &misc_mailbox_ops,
};

MISC_DYNAMIC_MINOR 的值在 Linux 5.0 中是 255,但这里的 255 是“请框架动态分配”的标记。misc_register() 成功后,minor 字段会被替换成实际分配的次设备号。

misc_register 封装了什么

驱动提供 struct miscdevice
        │
        ▼
misc_register()
        ├─ 分配或检查次设备号
        ├─ 组合 dev_t = MKDEV(10, minor)
        ├─ 加入 misc 设备链表
        └─ 在 misc class 下创建设备
                    │
                    ▼
             /dev/misc_mailbox

因此驱动通常不再自行执行:

  • alloc_chrdev_region()
  • cdev_alloc() / cdev_add()
  • class_create()
  • device_create()

注销时用 misc_deregister() 完成对应清理。

与基础字符设备的对比

项目基础字符设备misc 设备
设备类型字符设备字符设备
主设备号驱动自行申请共用 10
次设备号驱动管理可由框架动态分配
注册入口多个 cdev/device APImisc_register()
注销入口驱动逆序释放misc_deregister()
file_operations驱动提供驱动提供

misc 适合结构简单的字符设备。若设备已经属于一个成熟子系统,通常应使用那个子系统的专用框架,而不是为了少写代码一律做成 misc 设备。

证据与来源

  • Running Linux Kernel 5.0:include/uapi/linux/major.h 中的 MISC_MAJOR。
  • Running Linux Kernel 5.0:include/linux/miscdevice.h 中的 struct miscdevice 和 MISC_DYNAMIC_MINOR。
  • Running Linux Kernel 5.0:drivers/char/misc.c 中的 misc_register()、misc_deregister() 和 misc_init()。
  • 实验手册 v2.0.7,第 6.2 节“使用 misc 机制来创建设备”。

关联

待验证

  • 第 6 章完成后阅读 misc_open() 如何根据次设备号找到具体 miscdevice 并替换 file_operations。
  • 后续结合真实硬件判断何时应使用 misc,何时应接入专用驱动子系统。