Linux内核提供的杂项设备(miscdevice)具有很强的包容性,在实际开发过程中使用简单。但是有一个较大的缺点就是,杂项设备的次设备号的分配都是软件开发者自己随意分配的,因此移植性较差,有时会造成挂载后无法使用的情况,因此在选择次设备号前应当对其内核中杂项设备号的分配进行查询后再分配合适的次设备号。当然Linux总会阻止我们做这样的傻事,我们可将miscdevice设备结构体的成员minor设为MISC_DYNAMIC_MINOR,以此让系统自动分配次设备号。
miscdevice设备共享主设备号为10的MISC_MAJOR,其本质上是一个字符设备,其次设备号MINOR可在实际编写的驱动中设置。系统中的所有该类设备形成一个链表的形式,当系统访问该类设备时,以遍历该链表的形式,通过次设备号匹配对应的miscdevice设备,进而对设备进行file_operations的接口进行操作。
杂项设备在实际的工作过程:insmod杂项设备->设备初始化->创建misc class->注册一个字符设备(设备号:10)->调用misc_register()注册一个杂项设备->生成设备节点。
主要结构体:
struct miscdevice{
int minor; // 若设置为MISC_DYNAMIC_MINOR,系统自动分配未使用的minor
const char *name;
const stuct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this device;
const char *nodename;
mode_t mode;
};
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};
miscdevice设备的注册和注销
注册:int misc_register(struct miscdevice *misc)
注销:int misc_deregister(struct miscdevice *misc)