如何赋予Sysfs属性写权限?

如何赋予Sysfs属性写权限?

我想编写一个驱动程序来将一些信息传递给设备,为此我创建了一个 sysfs 条目。它工作正常,但问题是除非我以管理员身份登录,否则我没有写入它的权限。我希望它具有开放的读写权限。

按照建议我编写驱动程序的方式,我使用以下宏来设置 sysfs 属性:

__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);

问题很明显,我使用了 660 作为权限而不是 666。

但是,当我尝试将权限设置为 666 或使用定义的 S_IWUGO | S_IRUGO,我收到错误。我可以设置开放读取权限,但不能设置写入权限。显然有人遇到了同样的问题,但我没有看到该线程上给出的任何答案。

我总是可以使用 chmod 设置权限,但这似乎是笨拙且烦人的解决方案,我宁愿学习如何正确编写驱动程序。为什么我不允许设置S_IWUGO?

答案1

__ATTR宏扩展为以下内容 [1]:

#define __ATTR(_name, _mode, _show, _store) {   \
    .attr = {.name = __stringify(_name),        \
    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },  \
    .show   = _show,                            \
    .store  = _store,                           \
}

注意宏的使用VERIFY_OCTAL_PERMISSIONS。该宏扩展为以下 [2]:

#define VERIFY_OCTAL_PERMISSIONS(perms)                                 \
    (BUILD_BUG_ON_ZERO((perms) < 0) +                                   \
     BUILD_BUG_ON_ZERO((perms) > 0777) +                                \
     /* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */            \
     BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) +   \
     BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) +          \
     /* USER_WRITABLE >= GROUP_WRITABLE */                              \
     BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) +   \
     /* OTHER_WRITABLE?  Generally considered a bad idea. */            \
     BUILD_BUG_ON_ZERO((perms) & 2) +                                   \
     (perms))

你得到的版本BUILD_BUG_ON_ZERO取决于我没有找到的宏,但你应该注意上面宏中的注释:“OTHER_WRITABLE?通常被认为是一个坏主意”。

虽然我没有跟踪调用路径,但我的猜测是代码过滤/忽略o+w

话虽如此,为什么您希望非特权用户能够直接与硬件交互?

[1]http://elixir.free-electrons.com/linux/v4.14/source/include/linux/sysfs.h#L101

[2]http://elixir.free-electrons.com/linux/v4.14/source/include/linux/kernel.h#L940

相关内容