首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么struct cdev有kobject成员?

为什么struct cdev有kobject成员?
EN

Stack Overflow用户
提问于 2013-07-11 23:41:59
回答 3查看 769关注 0票数 2

奇怪的是,struct cdevstruct kobject会员,有谁知道原因吗?

EN

回答 3

Stack Overflow用户

发布于 2013-07-12 12:59:11

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

来源:Linux Kernel Development by Robert Love

票数 2
EN

Stack Overflow用户

发布于 2013-07-12 20:51:08

Sysfs是一个虚拟文件系统,它以分层模式描述系统可用的设备。这是通过使用struct kobj完成的。

代码语言:javascript
运行
复制
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执行上述操作。

票数 2
EN

Stack Overflow用户

发布于 2021-10-07 13:15:19

有两个目的:

kref内部提供的

  1. for reference counting,。

代码语言:javascript
运行
复制
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. for release,这也是为什么kref是不够的(kref没有发布钩子)。

代码语言:javascript
运行
复制
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,
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17597800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档