我想编写一个驱动程序来将一些信息传递给设备,为此我创建了一个 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