在modprobe或者insmod后,如果不自动创建设备文件,需要mknod手动创建设备文件,然后应用程序才能工作,
我们可以在安装了模块后,自动在/dev下创建设备文件
在设备中添加用于创建设备文件的class和每个即将在/dev下创建的设备struct device
如下:
struct mem_dev
{
char *data;
unsigned long size;
struct class *dev_class; //class结构指针,用来保存即将要创建的设备结构名,用于自动在/dev下创建设备文件,再为每个设备调用device_create创建对应的设备
struct device *device1;
struct device *device2; //两个即将在、/dev 下创建的设备名
wait_queue_head_t my_read_queue; //在设备描述结构中添加读取等待队列,等待队列是属于设备的
};
然后再模块初始化函数中添加下面代码,首先创建使用class_create来创建class,然后每次调用device_create来创建设备文件
在init_module中添加下代码:
struct mem_dev *mem_dev p; 设备
static int init_module()
{
......
mem_devp->dev_class=class_create(THIS_MODULE,"memdev"); //为每个驱动创建class,要依据向内核注册的设备名称来创建class,然后再调用device_create来创建设备文件
if(IS_ERR(mem_devp->dev_class))//检测class创建是否成功
{
printk(KERN_INFO"dev_class create error!/n");
goto class_err;
}
mem_devp->device1=device_create(mem_devp->dev_class,NULL,MKDEV (mem_major,0),NULL,"memdev_select1"); //创建的设备名称是memdev_select1,第三个参数是设备号,主设备号是mem_major,次设备号是0
mem_devp->device2=device_create(mem_devp->dev_class,NULL,MKDEV(mem_major,1),NULL,"memdev_select2"); //创建的设备名称是memdev_select2,主设备号是mem_major,次设备号是1
......
class_err:
kfree(mem_devp);
}
在卸载模块时候,要把/dev中的设备文件同时卸载掉
static void memdev_exit(void)
{
//卸载模块时候也要同事把/dev/下的设备名卸载掉
device_unregister(mem_devp->device1);
device_unregister(mem_devp->device2); //卸载掉dev中对应的设备文件
class_destroy(mem_devp->dev_class); //卸载设备队对应的class
cdev_del(&cdev); /*注销设备*/
kfree(mem_devp); /*释放设备结构体内存*/
unregister_chrdev_region(MKDEV(mem_major, 0), 2); /*释放设备号*/
}