struct kobject {
const char *name; //名字
struct list_head entry; // 用来挂在 kset-》list上的
struct kobject *parent; // 父结点 可以是 kobj, kset-》obj ,空
struct kset *kset; //所属kset
struct kobj_type *ktype; // 所属类型
struct sysfs_dirent *sd; //sysfs 的目录
struct kref kref; // 引用计数
unsigned int state_initialized:1; //初始化后置1
unsigned int state_in_sysfs:1; // 创建目录后置1
unsigned int state_add_uevent_sent:1; // kobj_add后置1
unsigned int state_remove_uevent_sent:1; //kobj——remove后置1
unsigned int uevent_suppress:1; //用来控制丢弃uevnet位
};
struct kobj_type {
void (*release)(struct kobject *kobj); //释放函数
const struct sysfs_ops *sysfs_ops; //sysfs控制函数
struct attribute **default_attrs; //默认属性
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
struct kset {
struct list_head list; //用来挂kobj-》entry
spinlock_t list_lock; //操作list的锁
struct kobject kobj; //kset的根kobj节点,完全利用其内容
const struct kset_uevent_ops *uevent_ops;
};
struct klist {
spinlock_t k_lock; //操作链表的锁
struct list_head k_list; //用来挂klist_node-》n_node
void (*get)(struct klist_node *); //顶层的初始化
void (*put)(struct klist_node *); //顶层的释放函数
} __attribute__ ((aligned (sizeof(void *))));
struct klist_node {
void *n_klist; //指向klist
struct list_head n_node; //挂在klist-》k_list
struct kref n_ref; //引用计数
};