如前所述,设备的主设备号实在创建字符设备时写死的,每次都去手动确定主设备号是不现实的。
所以要让内核自己确定主设备号,同样的,设备文件也不必每次mknod创建,应该将设备的主次设备号和名字
给到系统自己创建。
首先,定义连个全局变量,分别是设备类和设备文件、主设备号
static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;
int major;
注册设备和创建设备文件的函数接口:
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核
firstdrv_class = class_create(THIS_MODULE, "firstdrv");
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */
有注册,就要有销毁:
unregister_chrdev(major, "first_drv"); // 卸载
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
这样,在应用程序中的设备名字只要和驱动程序中的一致,那么主设备号都是有系统自己确定的,就没问题。
而设备文件之所以会在卸载驱动的时候被自动删除,是因为内核存在mdev机制。