2

struct cdev有会员很奇怪,有struct kobject大神知道原因吗?

4

3 回答 3

2

当 kobject 嵌入到其他结构中时,这些结构接收 kobject 提供的标准化功能。最重要的是,结构的嵌入 kobject 现在使结构成为对象层次结构的一部分。例如,该结构可以通过父指针和列表cdev在对象层次结构中呈现cdev->kobj.parentcdev->kobj.entry

资料来源:Robert Love 的 Linux 内核开发

于 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

有两个目的:

  1. 用于引用计数,由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);
    }
}
  1. 对于 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 回答