gpt4 book ai didi

linux - container_of 未返回预期地址

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

我不确定我做错了什么,但现在是时候多加留意了。我使用 device_create() 制作一个设备,提供一些“额外数据”,如下所示:

    pDevice = device_create(ahcip_class, NULL, /*no parent*/
MKDEV(AHCIP_MAJOR, AHCIP_MINOR + i), &mydevs[i],
DRIVER_NAME "%d", AHCIP_MINOR + i);

期望我的 sysfs 属性函数将获取指向 struct devicestruct kobject 成员的指针,我使用我的属性函数执行以下操作

static ahcip_dev *get_ahcip_dev(struct kobject *ko)
{
ahcip_dev *adev = NULL;
struct device *pdev = container_of(ko, struct device, kobj);
if (!pdev) {
pr_err("%s:%d unable to find device struct in kobject\n",
__func__, __LINE__);
return NULL;
}

/* some debugging stuff */
pr_info("%s:%d mydevs[0] %p\n", __func__, __LINE__, mydevs);
pr_info("%s:%d mydevs[1] %p\n", __func__, __LINE__, mydevs+1);
pr_info("%s:%d mydevs[0].psysfs_dev %p\n", __func__, __LINE__,
mydevs->psysfs_dev);
pr_info("%s:%d mydevs[1].psysfs_dev %p\n", __func__, __LINE__,
(mydevs + 1)->psysfs_dev);
pr_info("%s:%d pdev %p\n", __func__, __LINE__, pdev);
adev = (ahcip_dev*)dev_get_drvdata(pdev);

/* return the pointer anyway, but if it's null, print to klog */
if (!adev)
pr_err("%s:%d no ahcip_dev, private driver data is NULL\n",
__func__, __LINE__);

return adev;
}

static ssize_t pxis_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buff)
{
u32 pi = 0;
ahcip_dev *adev = get_ahcip_dev(kobj);

/* get_ahcip_dev() will print what happened, this needs to return
* error code
*/
if (!adev)
return -EIO;

pi = adev->port_index;

return sprintf(buff, "%08x\n", get_port_reg(adev->hba->ports[pi], 0x10));
}

上述函数的输出(压缩)显示:

get_ahcip_dev:175 mydevs[1].psysfs_dev ffff88011b2b4800
get_ahcip_dev:176 pdev ffff88011b2b47f0
在这种情况下,pdev 应指向与 mydevs[1].psysfs_dev 相同的内存位置,但它是“较早”的 16 个字节。我做错了什么?

最佳答案

我不想回答自己的问题,但在这种情况下这似乎是合适的。问题的根源在于对属性函数需要处理的内容的错误假设。属性函数有这个原型(prototype) you can view in context here

ssize_t (*show)(struct kobject *, struct attribute *,char *);
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);

由于 device_create() 函数返回一个 struct device 对象,定义如下 ( excerpt only, see full def here )

struct device {
struct device *parent;

struct device_private *p;

struct kobject kobj;
...
}

我假设我的属性函数必须处理的是 this 指针。通读问题的描述可以看出,当我使用 container_of 宏来获取我所认为的包含 struct device 的地址时,我“提前”了 16 个字节。请注意,该结构的前两个字段是指针。在我的 64 位系统上,这是 16 个字节。

由于函数原型(prototype)的定义如上所示,我假设我正在获取对 kobj 字段的引用。相反,我得到了实际的 struct device 对象。换句话说,我在函数输入时得到了我想要的地址,并且仍在尝试找到它。

与此相关的一些内容可能记录在迷宫般的 Linux 内核文档中。如果有人知道,请在此处放一个链接。我读了很多书,但没有看到这一点。我希望这个问题和答案可以帮助其他内核新手。

关于linux - container_of 未返回预期地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549899/

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