使用linux-2.6.30.4。
文件的管理使用的是 sysfs.(由udev制作的文件系统)
涉及两个函数:
virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk");
device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk");
使用需添加头文件 #include <linux/device.h>
说明:
当使用利用udev制作的文件系统时,Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点。
内核中定义了struct class结构体,一个struct class结构体类型变量对应一个类(有待商榷), 内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应 device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。
在linux-2.6.30.4,struct class定义在头文件include/linux/device.h中,
struct class {
const char *name;
struct module *owner;
struct class_attribute *class_attrs;
struct device_attribute *dev_attrs;
struct kobject *dev_kobj;
int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
void (*class_release)(struct class *class);
void (*dev_release)(struct device *dev);
int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);
struct dev_pm_ops *pm;
struct class_private *p;
};
class_create(…)头文件include/linux/device.h中,
#define class_create(owner, name) /
({ /
static struct lock_class_key __key; /
__class_create(owner, name, &__key); /
})
__class_create在/drivers/base/class.c中实现:
struct class *__class_create(struct module *owner, const char *name,
struct lock_class_key *key)
device_create(…)函数在/drivers/base/core.c中实现:
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
* device_create - creates a device and registers it with sysfs
* @class: pointer to the struct class that this device should be registered to
* @parent: pointer to the parent struct device of this new device, if any
* @devt: the dev_t for the char device to be added
* @drvdata: the data to be added to the device for callbacks
* @fmt: string for the device's name
使用示例:
virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk");
device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk");
示例程序(一个简单的字符驱动):
struct class *virtual_disk_class; /*by yinhf.*/ /*设备驱动模块加载函数*/ int VirtualDisk_init(void) { int result; dev_t devno = MKDEV(VirtualDisk_major, 0); /*构建设备号*/ /* 申请设备号*/ if (VirtualDisk_major) /* 如果不为0,则静态申请*/ result = register_chrdev_region(devno, 1, "VirtualDisk"); else /* 动态申请设备号 */ { result = alloc_chrdev_region(&devno, 0, 1, "VirtualDisk"); VirtualDisk_major = MAJOR(devno);/* 从申请设备号中得到主设备号 */ } if (result < 0) return result; /* 动态申请设备结构体的内存*/ Virtualdisk_devp = kmalloc(sizeof(struct VirtualDisk), GFP_KERNEL); if (!Virtualdisk_devp) /*申请失败*/ { result = - ENOMEM; goto fail_kmalloc; } memset(Virtualdisk_devp, 0, sizeof(struct VirtualDisk));/*将内存清零*/ /*初始化并且添加cdev结构体*/ VirtualDisk_setup_cdev(Virtualdisk_devp, 0); // devfs_mk_cdev(devno, S_IFCHR|S_IRUGO|S_IWUSR, "VirtualDisk"); /*yinhf*/ printk(KERN_ALERT "Virtualdisk Success/n"); /* create virtual_disk_class under /sysfs by yinhf.*/ virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk"); if(IS_ERR(virtual_disk_class)) { printk("Err: failed in creating virtual_disk_class./n"); return -1; } /* register your own device in sysfs, and this will cause udev to create corresponding device node */ device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk"); printk (KERN_INFO "Registered character driver VirtualDisk./n"); /*end create virtual_disk_class by yinhf.*/ return 0; fail_kmalloc: unregister_chrdev_region(devno, 1); return result; }
/*模块卸载函数*/ void VirtualDisk_exit(void) { cdev_del(&Virtualdisk_devp->cdev); /*注销cdev*/ kfree(Virtualdisk_devp); /*释放设备结构体内存*/ device_destroy(virtual_disk_class, MKDEV(VirtualDisk_major, 0)); //delete device node under /dev class_destroy(virtual_disk_class); //delete class created by us unregister_chrdev_region(MKDEV(VirtualDisk_major, 0), 1); /*释放设备号*/ }
参考网址:
http://blog.csdn.net/engerled/archive/2011/02/24/6205722.aspx