函数__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()的分析文档。