gpt4 book ai didi

对创建二进制 sysfs 条目感到困惑

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:49 26 4
gpt4 key购买 nike

在内核 4.0 上,当单步执行 sysfs_create_bin_file 的内核源代码时,我注意到它传递给了 sysfs_add_file(kobj->sd, &attr->attr, true); &attr->attrbin_attribute 结构中的 struct attribute 结构。

在我访问 sysfs_add_file_mode_ns 之前,这是有道理的,它是直接从 sysfs_add_file 调用的,并且在 line #277 上设置临时变量 stuct bin_attribute *battr = (void*)attr;

此时这不是指向一个结构属性吗,它是如何将它解析为正确的结构的(由于使用调用sysfs_add_file &attr->attr 关于 line #483 )?

代码

int sysfs_create_bin_file(struct kobject *kobj,
const struct bin_attribute *attr)
{
BUG_ON(!kobj || !kobj->sd || !attr);

return sysfs_add_file(kobj->sd, &attr->attr, true);
}

int sysfs_add_file(struct kernfs_node *parent, const struct attribute *attr,
bool is_bin)
{
return sysfs_add_file_mode_ns(parent, attr, is_bin, attr->mode, NULL);
}

int sysfs_add_file_mode_ns(struct kernfs_node *parent,
const struct attribute *attr, bool is_bin,
umode_t mode, const void *ns)
{
struct lock_class_key *key = NULL;
const struct kernfs_ops *ops;
struct kernfs_node *kn;
loff_t size;

if (!is_bin) {
...
} else {


struct bin_attribute *battr = (void *)attr;
...
}

最佳答案

线

stuct bin_attribute *battr = (void*)attr;

从指向其第一个字段 attr 类型struct attribute 的指针正确获取指向bin_attribute 结构的指针.


通常,Linux 内核开发人员倾向于使用 container_of 宏来获取指向结构类型的指针,知道指向其字段的指针。上述转换的更“规范”方式是:

stuct bin_attribute *battr = container_of(attr, struct bin_attribute, attr);

(在这个调用中,第一个 attr 参数指的是 pointer,第三个 attr 参数指的是 field 的名字)。

关于对创建二进制 sysfs 条目感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526450/

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