我正在尝试创建一个c程序来访问嵌入式Linux系统上的GPIO,该系统将由非root用户运行。我已经可以通过sysfs(/ sys / class / gpio)访问GPIO,并创建了一个使用mmap(通过/ dev / mem /)来控制GPIO的简单程序。但是要写入/ sys / class / gpio /和/ dev / mem /,您必须具有root权限。在以非root用户身份运行的程序中访问GPIO的最“正确”或标准方法是什么?
编写设备驱动程序?
赋予用户对/ sys / class / gpio /的读/写权限,以便程序可以使用sysfs?
或者授予用户对/ dev / mem /的读/写权限,以便程序可以使用mmap()?
由于
答案 0 :(得分:1)
一个可能的选择是通过设置s
位来创建流程setuid。
e.g。
chmod +s myExectuable
但是,这会产生严重的安全隐患,因为这个过程会以根本方式运行 - 带来所有危险。如果您真的信任用户空间应用程序,那么只有一个选项,即使这样,也有风险。
我不认为在不破坏内核的情况下更改sysfs的默认所有权和权限是不可能的,即使这样也很棘手:sysfs与Linux Driver模型的对象模型错综复杂地联系在一起。
/dev/
上的权限可能会更幸运。
最终,解决此问题的正确方法是内核模式驱动程序 - 您可以在其中实现您希望的任何细粒度安全性(或缺少)。此外,您可以针对允许用户模式应用程序控制硬件的任何潜在不良影响实施缓解。
答案 1 :(得分:0)
在/ sys / class / gpio下授予自定义用户组对特定需要节点的访问权限是一个相当可靠的解决方案 - 可以完全从启动脚本完成,无需内核级编程。