Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用kobject_create_和_add动态创建kobject与使用kobject_init_和_add函数动态创建kobject之间的区别_Linux_Linux Kernel_Linux Device Driver_Embedded Linux - Fatal编程技术网

Linux 使用kobject_create_和_add动态创建kobject与使用kobject_init_和_add函数动态创建kobject之间的区别

Linux 使用kobject_create_和_add动态创建kobject与使用kobject_init_和_add函数动态创建kobject之间的区别,linux,linux-kernel,linux-device-driver,embedded-linux,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,使用kobject_create_和_add动态创建kobject与使用kobject_init_和_add函数动态创建kobject有什么区别 kobject_create_和_add分配一个新的kobject,而kobject_init_和_add初始化并将kobject传递给它 struct uio_mem { struct kobject kobj; unsigned long addr; unsigned long size; int memtype; void __iomem *in

使用kobject_create_和_add动态创建kobject与使用kobject_init_和_add函数动态创建kobject有什么区别

kobject_create_和_add分配一个新的kobject,而kobject_init_和_add初始化并将kobject传递给它

struct uio_mem {
struct kobject kobj;
unsigned long addr;
unsigned long size;
int memtype;
void __iomem *internal_addr;
};
我想在显示和存储功能中使用uio_mem,我可以使用kobject_create_和add吗

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

有可能从kobj那里得到uio_mem吗?

我知道这个问题很老了,但无论如何我想回答它(也许对其他人会有帮助)

首先,kobjects在ldd.3(Ch14)和文档(,)中都有很好的描述(作为基本内核结构),下面是这些源代码的一个快捷方式

让我们从结尾开始:kobject只是实现Linux驱动程序继承的一种方式,与sysfs相关的每个驱动程序都应该处理对kobject的引用(您可以将其视为一个共同的祖先) 因此,我们有一个应该嵌入驱动程序结构中的kobject(在我们的例子中是struct uio_mem)

但是,使用kobjects的代码通常有相反的问题:给定struct kobject指针,指向包含结构的指针是什么

您应该避免像操纵kobject这样的编程技巧,而是使用宏的容器

因此,将指针转换为嵌入在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: 看

为了回答第二个/第一个问题,最好说明为什么我们需要kobject_create和kobject_init? 主要原因是,要运行kobject_init,您需要确保所有字段都由零填充,如果不是坏事的话。 kobject_create在实现中没有这个问题,它使用kzalloc创建对象,然后添加它。据我所知,函数比init更安全,但我不知道是否有更大的区别。另一件事是关于对象之间的依赖关系(如果驱动程序中有不同的依赖kobject),那么首先使用init,然后创建其他对象是有意义的,例如iommu_group_alloc(通过kobject_create_和_add,默认情况下,您不会获得任何属性,但与父/文件夹类似,init将通过ktype创建属性)