gpt4 book ai didi

linux - 使用kobject_create_and_add和kobject_init_and_add函数动态创建kobject的区别

转载 作者:太空狗 更新时间:2023-10-29 12:32:04 29 4
gpt4 key购买 nike

使用kobject_create_and_add和kobject_init_and_add函数动态创建kobject有什么区别?

kobject_create_and_add 分配一个新的 kobject,而 kobject_init_and_add 初始化并将 kobject 传递给它。

struct uio_mem {
struct kobject kobj;
unsigned long addr;
unsigned long size;
int memtype;
void __iomem *internal_addr;
};

我想在我的显示和存储功能中使用 uio_mem,我可以使用 kobject_create_and_add 吗?

static ssize_t test_attr_show(struct kobject *kobj, struct kobj_attribute *attr,

是否可以从 kobj 获取 uio_mem?

最佳答案

我知道这个问题有点老了,但无论如何我还是想回答一下(这可能对以后的其他人有帮助)。

首先:kobjects 在 ldd.3(第 14 章)和文档(https://lwn.net/Articles/54651/http://lwn.net/Articles/51437/)中都有很好的描述(作为基本内核结构)。下面我根据这些来源和我的理解提供了一个快捷方式。有关详细信息,请使用这些源代码和内核代码。

让我们从头开始:为什么我们需要kobjects?它们是为 Linux 驱动程序提供实现继承方式的内核结构。每个与 sysfs 相关的驱动程序都应该处理对 kobject 的引用(您可以将其视为一个共同的祖先)。

实现方式:kobject 需要嵌入驱动程序结构(在您的情况下为 struct uio_mem)。

使用 kobjects 的代码通常有相反的问题:给定一个 struct kobject 指针,指向包含结构的指针是什么?一般来说,应该避免对象操作等编程技巧,而是使用 container_of 宏。

将指针转换为嵌入在 struct uio_struct 中的名为 kp 的 struct kobject 的方法是:

// container_of(pointer, type, member)
struct cdev *uio_struct = container_of(kp, struct uio_struct, kobj);

还有自己的属性,你可以找到没有给你任何 kobject 的显示/存储功能。

我想到的一个很好的例子是 virtio 驱动程序:见http://lxr.free-electrons.com/source/drivers/virtio/virtio.c?v=3.7

要回答您的第一个问题,我们需要解释为什么我们需要kobject_createkobject_init

主要原因是要运行kobject_init,您需要确保所有字段都用零填充,否则可能会发生坏事。函数 kobject_create 没有这个问题:在实现中,它使用 kzalloc 创建对象,然后添加它。据我了解,此函数比 init 更安全,但从功能的角度来看,我认为两者之间没有更大的区别。

另一件需要考虑的事情是对象之间的依赖关系(如果你的驱动程序中有不同的依赖 kobject),那么首先使用 init 然后创建其他对象是有意义的,例如 iommu_group_alloc (通过使用 kobject_create_and_add 默认情况下您不会获得任何属性,但会像父/文件夹一样,init 将通过 ktype 创建属性)

关于linux - 使用kobject_create_and_add和kobject_init_and_add函数动态创建kobject的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23861456/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com