使用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;
};
我想在我的show and store函数中使用uio_mem,我可以使用kobject_create_and_add吗?
static ssize_t test_attr_show(struct kobject *kobj, struct kobj_attribute *attr,
是否有可能从kobj获得uio_mem?
答案 0 :(得分:1)
我知道这个问题已经很老了但无论如何我想回答它(可能会对其他人有所帮助)。
首先,在ldd.3(Ch14)和文档(https://lwn.net/Articles/54651/,http://lwn.net/Articles/51437/)中,kobjects被很好地描述(作为基本的内核结构),所以下面是一个快捷方式这些来源。
让我们从最后开始:kobjects只是实现Linux驱动程序继承的一种方式,每个与sysfs相关的驱动程序都应该处理对kobject的引用(你可以把它看作是一个共同的祖先) 所以我们有kobject应该嵌入到驱动程序结构中(在我们的例子中是struct uio_mem)。
与kobjects一起使用的代码经常会遇到相反的问题,但是:给定一个struct kobject指针,指向包含结构的指针是什么?
你应该避免编程技巧,比如操纵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的show / store函数。
我想到的很好的例子是virtio: 见http://lxr.free-electrons.com/source/drivers/virtio/virtio.c?v=3.7
要回答第二个/第一个问题,最好说明为什么我们需要kobject_create和kobject_init? 主要原因是要运行kobject_init,你需要确保所有字段都填充零,如果没有坏事可能发生。 kobject_create在实现中没有这个问题,它使用kzalloc创建对象,然后添加它。所以据我所知,函数比init更安全,但我不知道是否存在更大的差异。另一件事是关于对象之间的依赖关系(如果你的驱动程序中有不同的依赖kobject),那么首先使用init然后创建其他对象是有意义的,例如iommu_group_alloc(通过kobject_create_and_add,默认情况下你不会得到任何属性)但是就像父/文件夹一样,init会通过ktype创建属性