在有2.6系列版本中支持udev管理设备文件可以方便的创建设备节点,不必使用mknod来创建,本文使用最小编码来说明创建的几个方法。
//主要用到的四个方法在linux/device.h定义: //创建类和释放类的函数 创建成后将创建/sys/class/name文件夹 extern struct class *class_create(struct module *owner, const char *name); extern void class_destroy(struct class *cls); //在低版本的内核提供class_device_create来创建设备节点 和 删除设备的方法 extern struct class_device *class_device_create(struct class *cls, struct class_device *parent, dev_t devt, struct device *device, const char *fmt, ...) __attribute__((format(printf,5,6))); extern void class_device_destroy(struct class *cls, dev_t devt); //在高版本的内核提供device_create来创建设备节点 和 删除设备的方法 extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) __attribute__((format(printf, 5, 6))); extern void device_destroy(struct class *cls, dev_t devt); //如果你不知道你的到底哪个函数,可以直接到内核头文件目录下找device.h,搜索一下定义的是哪个函数
#include <linux/module.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/device.h> #include <linux/kdev_t.h> #include <linux/err.h> MODULE_AUTHOR("my name"); MODULE_LICENSE("Dual BSD/GPL"); static int major_i=66; static int minor_i=0; struct class* mclass; static int node_init(void) { /*class_create 成后在/sys/class创建noddev文件夹*/ mclass=class_create(THIS_MODULE,"noddev"); if(IS_ERR(mclass)) { printk(KERN_ALERT "fail to create class\n"); return -1; } /*class_device_create 在/dev下创建 noddev0设备*/ device_create(mclass,NULL,MKDEV(major_i,minor_i),NULL,"noddev0"); /*这里最后一个参数可以用格式化参数 const char *fmt, ...*/ device_create(mclass,NULL,MKDEV(major_i,minor_i+20),NULL,"noddev%d",minor_i+20); printk(KERN_ALERT "create node success:\n"); printk(KERN_ALERT " ls -l /dev/noddev*\n"); printk(KERN_ALERT " ls -l /sys/class/noddev\n"); return 0; } static void node_exit(void) { /*删除创建的设备文件*/ device_destroy(mclass,MKDEV(major_i,minor_i)); device_destroy(mclass,MKDEV(major_i,minor_i+20)); class_destroy(mclass); /*删除类*/ printk(KERN_ALERT "goodbye\n"); } module_init(node_init); module_exit(node_exit);
加载结果
[root@localhost node]# insmod node.ko [root@localhost node]# dmesg | tail -3 [23503.365316] create node success: [23503.365319] ls -l /dev/noddev* [23503.365321] ls -l /sys/class/noddev [root@localhost node]# ls -l /dev/noddev* crw------- 1 root root 66, 0 11月 26 15:02 /dev/noddev0 crw------- 1 root root 66, 20 11月 26 15:02 /dev/noddev20 [root@localhost node]# ls -l /sys/class/noddev 总用量 0 lrwxrwxrwx 1 root root 0 11月 26 15:02 noddev0 -> ../../devices/virtual/noddev/noddev0 lrwxrwxrwx 1 root root 0 11月 26 15:02 noddev20 -> ../../devices/virtual/noddev/noddev20