Kobject
1、Kobject
1、定义在linux/kobject.h下面。
2、里面包含各种对象的基本单元,会提供一些功能型服务:对象引用计数、维护对象链表,对象上锁,对用户空间的表示。(对象是指类、总线、设备、驱动等结构体定义的变量)。在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录。从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的作用,这里的其他结构体可以看作是kobject的派生类
struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct sysfs_dirent *sd;
struct kref kref;
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
name 就是这个对象的名称
entry是维护对象链表,可以和其他kobject连接起来
parent 实现kobject进行上下层联系
kref kref.h
struct kref//引用计数
{
atomic_t refcount;
}
atomic_t 定义的变量是原子变量,进行的操作是原子操作,不可以被分割。
refcount 引用计数,被人用了就加一,少一个用的就减一,减到零后会被release掉。
2、kobj_type
简称ktype,每一个kobject都需要绑定一个ktype来提供相应功能
struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
release检测引用计数,如果是0,那么把对象整个占用的内存释放掉,不是零,把计数-1;
sysfs_ops,提供该对象在sysfs中的操作方法(show和store)linux/sysfs.h
struct sysfs_ops {
ssize_t (*show)(struct kobject *, struct attribute *,char *);
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
};
attribute属性,sysfs下面的文件形式存在的属性,就是应用接口
3、kset
struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
};
list_head list链表,用于和其他的链接
spinlock_t list_lock; 对象上锁
kset的主要作用是做顶层kobject的容器类
kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构
可以认为kset就是为了在sysfs中弄出目录,从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起
4、总结
1、sys 目录下的层次结构依赖于 kobject.parent ,未指定parent时,默认使用 kobject.kset.kobject 作为 parent,如果都没有,就出现在 /sys 目录下。
2、该 kobject 目录下的属性文件依赖于 kobject.ktype
3、设备驱动模型中的各种对象其内部都会包含一个kobject
4、kobject是属于kset的只不过内部有一个指针又指向kset
5、三者都是为了实现sysfs下面的东西,kobject是一个基础,kobj——type是目录里的文件及其操作方法,kset是构建目录层次结构。
6、什么是绑定,什么是包含
一个结构体中如果另一个结构体就存在这个结构体中就叫做包含
struct list_head entry;
struct kref kref;
如果是以结构体指针的形式存在,就叫做绑定
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct sysfs_dirent *sd;