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

文章描述了好几个步骤,首先是清空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详解


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值