Linux内核API __class_create

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

__class_create文件包含

#include <linux/device.h>

__class_create函数定义

在内核源码中的位置: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输入参数说明

函数__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返回参数说明

函数__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_create实例解析

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

赞(0)
未经允许不得转载:极客笔记 » Linux内核API __class_create
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址