kset_get函数定义如下:
static inline struct kset *kset_get(struct kset *k)
{
return k ? to_kset(kobject_get(&k->kobj)) : NULL;
}
static inline struct kset *to_kset(struct kobject *kobj)
{
return kobj ? container_of(kobj, struct kset, kobj) : NULL;
}
该函数是获取k结构体指针指向的结构体首地址。
有一点我不明白的是这个函数先获取k—>kobj的地址,然后传给 container_of宏定义,通过这个宏定义再获取k指向的结构体的首地址。这不是绕了一圈又绕回来了,内核这么做意义何在?
以上理解可能存在错误,望大神指教。
其中的kobject_get 函数会将kobj 的引用计数加一,并不是什么都没干
static inline struct kset *kset_get(struct kset *k)
{
return k ? to_kset(kobject_get(&k->kobj)) : NULL;
}
struct kobject *kobject_get(struct kobject *kobj)
{
if (kobj) {
if (!kobj->state_initialized)
WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
"initialized, yet kobject_get() is being "
"called.\n", kobject_name(kobj), kobj);
kref_get(&kobj->kref);
}
return kobj;
}
static inline void kref_get(struct kref *kref)
{
refcount_inc(&kref->refcount);
}