linux 2.6.13 开始,devfs不存在,udev取代devfs.
udev(mdev)存在应用层,可以实现设备文件的自动创建和删除。
过程:
驱动代码调用class_create创建一个class,再为每个设备调用class_create创建对应的设备。
※ 自动创建设备文件需要udev的支持
struct class *myclass = class_create(THIS_MODULE, "mydriver");
device_create(myclass,NULL, MKDEV(major_num, 0), NULL, "mydevice");
1 #include <linux/module.h> 2 3 #include <linux/fs.h> 4 5 #include <linux/device.h> /* device_create()*/ 6 7 struct class *myclass; 8 9 dev_t devno;/*设备号*/ 10 11 /*设备驱动模块加载函数*/ 12 static int memdev_init(void) 13 { 14 int result = -1;/*返回值*/ 15 /* 动态分配设备号 */ 16 result = alloc_chrdev_region(&devno, 0, 1, "memdev"); 17 if (result < 0) 18 { 19 return -1; 20 } 21 /* 22 mem_major = MAJOR(devno); 23 */ 24 25 /*自动创建设备文件*/ 26 myclass = class_create(THIS_MODULE,"test_char"); /*在sys下创建类目录/sys/class/test_char*/ 27 if(IS_ERR(myclass)) 28 { 29 printk("Err: failed in creating class.\n"); 30 return -1; 31 } 32 33 /*/dev目录下创建 memdev的设备文件*/ 34 device_create(myclass, NULL, devno, NULL, "memdev"); 35 36 return 0; 37 } 38 39 /*模块卸载函数*/ 40 static void memdev_exit(void) 41 { 42 43 device_destroy(myclass, devno); /*delete device node under /dev*/ 44 class_destroy(myclass); /*delete class created by us*/ 45 unregister_chrdev_region(devno, 1); /*释放设备号*/ 46 } 47 48 MODULE_AUTHOR("renhl"); 49 MODULE_LICENSE("GPL"); 50 51 module_init(memdev_init); 52 module_exit(memdev_exit);