4.11 杂项字符设备驱动
杂项框架是Linux内核提供的一个接口。该框架允许模块注册其各自的从设备编号。
通过杂项框架实现的字符设备驱动使用Linux内核为杂项设备分配主设备编号。这样可以避免为驱动定义一个专门的主设备编号。这一点很重要,因为主设备编号冲突的可能性与日俱增。使用杂项设备类别是一个避免该冲突的有效策略。对于每一个被侦测到的设备,系统动态地分配一个从设备编号。这个设备也会以一个目录的形式出现在sysfs虚拟文件系统的/sys/class/misc/
目录下。
官方分配给杂项驱动的主设备编号是10。对于只需要一个文件系统目录的小型设备,模块可以通过杂项驱动注册独有的从设备编号并管理。
注册一个从设备编号
杂项设备是通过包含在include/linux/miscdevice.h
中的miscdevice
数据结构定义的:
其中:
minor
是请求的从设备编号。name
是设备名称,通过/proc/misc
文件查看。fops
是一个指向file_operations
数据结构的指针。parent
是一个指向device
数据结构的指针,用于表示由该驱动暴露的硬件设备。
杂项驱动导出两个函数,misc_register()
和misc_deregister()
,用于注册/注销对应的从设备编号。这些函数在include/linux/miscdevice.h
文件中定义其函数原型,drivers/char/misc.c
文件中则定义了具体实现:
misc_register()
函数向内核注册一个杂项设备。如果从设备编号被设置为MISC_DYNAMIC_MINOR,那么系统会动态分配一个从设备编号并存放在miscdevice
数据结构中的minor
字段。对于其他情况则使用请求的从设备编号。
传递进来的数据结构会被内核持续引用,直到设备注销时该数据结构才会被销毁。默认情况下,针对设备执行open()
系统调用时,会将file->private_data
指向该数据结构。驱动不需要在fops
的open
接口中做相应的赋值操作。成功返回0,失败则返回一个负的错误码。
动态分配从设备编号的典型代码顺序如下: