自动创建设备节点

来源:互联网 发布:centos挂载iso文件 编辑:程序博客网 时间:2024/04/28 22:40

使用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");

 

示例程序(一个简单的字符驱动):

 

 

参考网址:

http://blog.csdn.net/engerled/archive/2011/02/24/6205722.aspx

原创粉丝点击