Arm 在以非root用户身份运行的程序上,通过sysfs、mmap或设备驱动程序控制GPIO?

Arm 在以非root用户身份运行的程序上,通过sysfs、mmap或设备驱动程序控制GPIO?,arm,embedded-linux,gpio,Arm,Embedded Linux,Gpio,我试图制作一个c程序来访问嵌入式linux系统上的GPIOs,该系统将由非root用户运行。我已经可以通过sysfs(/sys/class/gpio)访问GPIOs,并制作了一个简单的程序,使用mmap(通过/dev/mem/)控制GPIOs。但是,要写入/sys/class/gpio/和/dev/mem/必须具有root权限。在以非root用户身份运行的程序中,访问GPIO的最“正确”或标准方式是什么?编写设备驱动程序? 允许用户对/sys/class/gpio/进行读/写访问,以便程序可以使

我试图制作一个c程序来访问嵌入式linux系统上的GPIOs,该系统将由非root用户运行。我已经可以通过sysfs(/sys/class/gpio)访问GPIOs,并制作了一个简单的程序,使用mmap(通过/dev/mem/)控制GPIOs。但是,要写入/sys/class/gpio/和/dev/mem/必须具有root权限。在以非root用户身份运行的程序中,访问GPIO的最“正确”或标准方式是什么?
编写设备驱动程序?
允许用户对/sys/class/gpio/进行读/写访问,以便程序可以使用sysfs?
或者授予用户对/dev/mem/的读/写访问权,以便程序可以使用mmap()


谢谢

一个可能的选择是通过设置
s
位来进行处理

e、 g

chmod+s myExecutable

然而,这会带来可怕的安全影响,因为该过程会以根目录运行,并伴随着所有的危险。如果你真的信任用户空间应用程序,那么这只是一个选项,即使如此,也是有风险的

我认为在不破坏内核的情况下更改sysfs的默认所有权和权限是不可能的,即使这样也会很棘手:sysfs和Linux驱动程序模型的对象模型有着复杂的联系

您在
/dev/
上的权限可能会更幸运


最终,解决这个问题的正确方法是一个内核模式驱动程序——在这个驱动程序中,您可以实现任何您希望的细粒度安全性(或缺乏细粒度安全性)。此外,您可以实现缓解允许用户模式应用程序控制硬件的任何潜在不良影响

授予自定义用户组对/sys/class/gpio下特定需要的节点的访问权限是一个相当可靠的解决方案(如适用)——完全可以通过启动脚本完成,无需内核级编程。

谢谢,内核模块就是这样。不想给根用户访问权限,所以看起来这样做实际上可以更改sysfs节点的所有权或权限-只需使用嵌入式框上的状态指示灯重新测试即可。当然,这些更改不会在重新启动或重新加载模块后继续存在。非常有趣!这是如何实现的
chown
?是的,与普通文件一样,chown或chmod取决于您要更改的内容。