奇怪的是,struct cdev有struct kobject会员,有谁知道原因吗?
发布于 2013-07-12 12:59:11
当kobject嵌入到其他结构中时,这些结构接收kobject提供的标准化函数。最重要的是,该结构的嵌入式kobject现在支持该结构成为对象层次结构的一部分。例如,通过父指针cdev->kobj.parent和列表cdev->kobj.entry,可以在对象层次结构中呈现cdev结构
发布于 2013-07-12 20:51:08
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客户端)的话。我们让成员struct dev内部的kobj将驱动程序属性导出到用户空间虚拟文件系统(Sysfs)。Kobj结构成员处理所有操作,包括引用设备号(主要/次要)和文件操作,包括打开、读/写、关闭等。设备的数量。
在您的示例中,cdev_init & cdev_add将在内部使用kobj执行上述操作。
发布于 2021-10-07 13:15:19
有两个目的:
由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);
}
}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,
};https://stackoverflow.com/questions/17597800
复制相似问题