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: 名称
@kref: 引用计数,用于统计系统中引用该对象的次数。
struct
kref
{
atomic_t refcount;
};
|
看似多此一举,实际上是为了防止用户直接操作refcount。用struct kref进行封装后,用户须通过固定的接口来操作。如
void
kref_set(
struct
kref *kref,
int
num);
void
kref_init(
struct
kref *kref);
void
kref_get(
struct
kref *kref);
int
kref_put(
struct
kref *kref,
void
(*release) (
struct
kref *kref));
|
@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: 当kobject的引用计数减为0时,该指针指向的函数将被调用,进行kobject的释放处理。
@default_attrs:该kobject所具有的属性值,这些属性值通过sysfs文件系统到处到用户空间,用户也可
对这些值进行赋值。
struct
attribute {
const
char
*name;
mode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct
lock_class_key *key;
struct
lock_class_key skey;
#endif
};
|
@name: 属性名
@mode: 属性模式
其余两个属性仅在内核启动了对锁调试的支持时才有用。
@sysfs_ops: 该结构包括两个函数指针,其中show指向的函数用于向用户导出属性值,而store在用
户对属性进行赋值时被调用。
struct
sysfs_ops {
ssize_t (*show)(
struct
kobject *,
struct
attribute *,
char
*);
ssize_t (*store)(
struct
kobject *,
struct
attribute *,
const
char
*,
size_t
);
};
|
其余变量用于命名空间的支持,此处忽略。
组织结构相关的成员变量
@kset: 本kobject所属的kset。
kset是用于组织属于某种特定类型的kobject对象集合,这里的类型指的是对于某些时间具有某种相同
操作的意思。
struct
kset {
struct
list_head list;
spinlock_t list_lock;
struct
kobject kobj;
const
struct
kset_uevent_ops *uevent_ops;
};
|
@list: 用于组织本kset内的kobject对象。
@list_lock: 自旋锁,在遍历本set中的kobject对象时实现互斥操作。
@kobj: kset作为一个内核对象,其本身也作为kobject的一个实例。
@uevent_ops: uevent事件的响应函数。
struct
kset_uevent_ops {
int
(*
const
filter)(
struct
kset *kset,
struct
kobject *kobj);
const
char
*(*
const
name)(
struct
kset *kset,
struct
kobject *kobj);
int
(*
const
uevent)(
struct
kset *kset,
struct
kobject *kobj,
struct
kobj_uevent_env *env);
};
|
@filter: 过滤掉不感兴趣的uevent事件
@name: 获取subsystem环境变量
@uevent: uevent事件发送函数。
@entry: 属于同一个kset的kobject对象会组织成双向链表形式,entry为相应的链接元素。
struct
list_head
{
struct
list_head *prev, *next;
};
|
@parent: kobject除了根据其所属的kset进行组织以外,同时会按照父子关系组织成树形
结构,而parent则指向其父节点。
Sysfs文件系统相关的成员变量
@sysfs_dirent:在Sysfs文件系统中对应的节点,该节点可能为一个目录、链接等。
struct
sysfs_dirent {
atomic_t s_count;
atomic_t s_active;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct
lockdep_map dep_map;
#endif
struct
sysfs_dirent *s_parent;
struct
sysfs_dirent *s_sibling;
const
char
*s_name;
const
void
*s_ns;
/* namespace tag */
union
{
struct
sysfs_elem_dir s_dir;
struct
sysfs_elem_symlink s_symlink;
struct
sysfs_elem_attr s_attr;
struct
sysfs_elem_bin_attr s_bin_attr;
};
unsigned
int
s_flags;
unsigned
short
s_mode;
ino_t s_ino;
struct
sysfs_inode_attrs *s_iattr;
};
|
@s_count: 引用计数
@s_active: 对成员变量解除引用时,要获得此变量的引用。
@s_parent; 父节点
@s_sibling: 兄弟节点
@s_name;
@s_ns;
@union *: 根据s_flags有不同实现。
@s_flags: 类型,只使用了低16位,在低16位中,低8位是节点类型,高8位是命名空间类型
@s_mode:
@s_ino: inode节点号
@s_iattr: 主要用于VFS层监视inode节点状态改变。