【问题标题】:add attribute to an existing kobject将属性添加到现有 kobject
【发布时间】:2015-08-19 17:57:25
【问题描述】:

我正在将我为 2.6.x 内核系列编写的驱动程序移植到 3.x(即 RH EL 6 -> RH EL 7)。我的驱动程序解决方案实际上包含两个模块:修改后的 ahci.c 形式(来自内核树)和我自己的上层字符驱动程序,用于访问 AHCI 寄存器,甚至对驱动器执行命令。

在移植到 CentOS 7 时,我遇到了一个有趣的问题。对我正在构建的驱动程序的更改删除了对 SYSFS 中 scsi_host 属性的访问。那么我的问题是,我可以将属性附加到 SYSFS 中已经存在的设备上吗?我遇到的每个示例都显示了在设备创建时创建属性,例如:

static ssize_t port_show(struct kobject *kobj, struct kobj_attribute *attr,
                         char *buff);
static struct kobj_attribute pxclb_attr = __ATTR(pxclb, 0664, port_show, NULL);
static struct attribute *attrs[] = {
    &pxclb_attr.attr,
    NULL,
};

static struct attribute_group port_group = {
    .attrs = attrs,
};

/* much other code */

sysfs_create_group(&kobj, &port_group);

这个例子来自我的字符驱动程序。我使用 Google 完成的所有搜索,并参考了我的 Linux Foundation Drivers 课程书,都显示了在设备创建时完成的属性创建。我可以随时添加吗?似乎可以随时致电sysfs_create_group()。这是真的吗?

【问题讨论】:

    标签: linux-kernel linux-device-driver udev


    【解决方案1】:

    您可以随时在 sysfs 中添加attribute

    几乎所有驱动程序都在probe 中添加attribute 的原因是用户空间对何时创建属性有严格的期望。当一个新设备在内核中注册时,会生成一个 uevent 来通知用户空间(如 udev)有一个新设备可用。如果在设备注册后添加属性,则用户空间不会收到通知,用户空间也不会知道新的属性。

    【讨论】:

    • 啊,是的,我只是在那个时候才看到添加属性的重要性。谢谢你的解释。我曾认为这是可能的/很好,但知道可能还有更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多