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

来源:互联网 发布:2017做淘宝还有钱赚吗 编辑:程序博客网 时间:2024/05/11 05:42

文章描述了好几个步骤,首先是清空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);//将引用计数设置为1INIT_LIST_HEAD(&kobj->entry);//初始化listkobj->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详解


0 0
原创粉丝点击