struct cdev
有会员很奇怪,有struct kobject
大神知道原因吗?
问问题
783 次
3 回答
2
当 kobject 嵌入到其他结构中时,这些结构接收 kobject 提供的标准化功能。最重要的是,结构的嵌入 kobject 现在使结构成为对象层次结构的一部分。例如,该结构可以通过父指针和列表cdev
在对象层次结构中呈现cdev->kobj.parent
cdev->kobj.entry
于 2013-07-12T04:59:11.130 回答
2
Sysfs
是一个虚拟文件系统,它以分层模式描述系统可用的设备。这是通过使用struct kobj
.
struct kobject {
char *k_name;
char name[KOBJ_NAME_LEN];
struct kref kref;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct dentry *dentry;
};
对于任何驱动程序 kobj 都需要将设备属性导出到,sysfs
如果我们考虑喜欢i2c_client
spi_device
(spi 客户端)。我们有 kobj 内部成员struct dev
将驱动程序属性导出到用户空间虚拟文件系统(Sysfs
)。结构成员处理所有操作,Kobj
包括引用设备号(主要/次要)和涉及到设备的打开、读/写、关闭等的文件操作。
在您的情况下cdev_init
, &cdev_add
将在内部使用 kobj 来执行上述操作。
于 2013-07-12T12:51:07.637 回答
0
有两个目的:
- 用于引用计数,由
kref
内部提供。
static struct kobject *cdev_get(struct cdev *p)
{
struct module *owner = p->owner;
struct kobject *kobj;
if (owner && !try_module_get(owner))
return NULL;
kobj = kobject_get_unless_zero(&p->kobj);
if (!kobj)
module_put(owner);
return kobj;
}
void cdev_put(struct cdev *p)
{
if (p) {
struct module *owner = p->owner;
kobject_put(&p->kobj);
module_put(owner);
}
}
- 对于 release,这也是
kref
不够的原因(kref
没有释放钩子)。
static void cdev_default_release(struct kobject *kobj)
{
struct cdev *p = container_of(kobj, struct cdev, kobj);
struct kobject *parent = kobj->parent;
cdev_purge(p);
kobject_put(parent);
}
static void cdev_dynamic_release(struct kobject *kobj)
{
struct cdev *p = container_of(kobj, struct cdev, kobj);
struct kobject *parent = kobj->parent;
cdev_purge(p);
kfree(p);
kobject_put(parent);
}
static struct kobj_type ktype_cdev_default = {
.release = cdev_default_release,
};
static struct kobj_type ktype_cdev_dynamic = {
.release = cdev_dynamic_release,
};
于 2021-10-07T13:15:19.443 回答