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?
宏
__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?通常被認為是個壞主意”。雖然我沒有追踪呼叫路徑,但我的猜測是程式碼 filters/ignores
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