Linux内核 __class_create()

函数:__class_create()

函数__class_create()用于动态创建设备的逻辑类,并完成部分相应字段的初始化,然后将其添加进Linux内核系统中。此函数的执行效果就是在目录/sys/class下创建一个新的文件夹,此文件夹的名字为此函数的第二个输入参数,但此文件夹是空的。

文件包含:

#include <linux/device.h>

函数定义:

在内核源码中的位置:linux-3.19.3/drivers/base/class.c

函数定义格式:

struct class * __must_check __class_create(struct module *owner, const char*name, struct lock_class_key *key)

输入参数说明:

函数__class_create()有三个输入参数,分别解释如下:

  • 参数owner是struct module结构体类型的指针变量,指向函数__class_create()即将创建的struct class类型对象的拥有者,一般赋值为THIS_MODULE,此结构体的详细定义见文件linux-3.19.3/include/linux/module.h。

  • 参数name是char类型的指针变量,代表即将创建的struct class变量的名字,用于给struct class的name字段赋值。

  • 参数key是struct lock_class_key结构体类型的变量,代表访问struct class类型变量的互斥锁。

返回参数说明:

函数__class_create()的返回值是新创建的逻辑类,此结构体的定义见文件linux-3.19.3/include/linux/device.h,如下所示:

struct class {
    const char *name;
    struct module *owner;
    struct class_attribute *class_attrs;
    const struct attribute_group **dev_groups;
    struct kobject *dev_kobj;
    int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
    char *(*devnode)(struct device *dev, umode_t *mode);
    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);
    const struct kobj_ns_type_operations *ns_type;
    const void *(*namespace)(struct device *dev);
    const struct dev_pm_ops *pm;
    struct subsys_private *p;
}

其中:

  • 字段name代表此class对象的名字,即创建的设备文件的文件名,此设备文件位于/dev目录下。

  • 字段owner代表此class对象的拥有者,一般为THIS_MODULE。

  • 字段class_attrs代表此class对象的属性。

  • 字段dev_groups代表此class对象所对应的设备的属性。

  • 字段class_release是一个函数指针,指向当此class对象被释放时调用的处理函数。

  • 字段dev_release是一个函数指针,指向当此class对象所对应的逻辑设备被释放时调用的处理函数。

  • 字段p代表class对象的私有数据段。

实例解析:

此函数需要与函数class_destroy()配对使用,不能够单独测试。当单独测试时,第一次不会出现错误,但当第二次插入模块时就会出现错误,实例解析请读者参考酷客教程函数class_destroy()的分析文档。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!