您的位置:首页 > 运维架构 > Linux

[linux device driver] Chapter 14:kobject_init的理解

2015-02-23 15:59 405 查看
文章描述了好几个步骤,首先是清空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详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: