文章描述了好几个步骤,首先是清空kobject,这通常是使用memset清零包含kobject的结构体,比如:
memset(scullc_devices, 0, scullc_devs*sizeof (struct scullc_dev));
for (i = 0; i < scullc_devs; i++) {
scullc_devices[i].quantum = scullc_quantum;
scullc_devices[i].qset = scullc_qset;
sema_init (&scullc_devices[i].sem, 1);
scullc_setup_cdev(scullc_devices + i, i);
}
而scullc_devices就包含了kobject.
第二步是使用kobject_init设置内部变量,这个过程是scullc_setup_cdev调用cdev_init实现的:
void cdev_init(struct cdev *cdev, struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
cdev->kobj.ktype = &ktype_cdev_default;
kobject_init(&cdev->kobj);
cdev->ops = fops;
}
然后深入分析kboject_init:
void kobject_init(struct kobject * kobj)
{
kref_init(&kobj->kref);//将引用计数设置为1
INIT_LIST_HEAD(&kobj->entry);//初始化list
kobj->kset = kset_get(kobj->kset);//设置kobj
}
void kref_init(struct kref *kref)
{
atomic_set(&kref->refcount,1);
}
static inline struct kset * to_kset(struct kobject * kobj)
{
return kobj ? container_of(kobj,struct kset,kobj) : NULL;
}
static inline struct kset * kset_get(struct kset * k)
{
return k ? to_kset(kobject_get(&k->kobj)) : NULL;
}
从上面来看,是将kobject的引用计数设置为1,
其他相关的问题,可以参照这篇文章,相当完整:设备模型-kobject详解