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

标签 arm embedded-linux gpio

我正在尝试编写一个 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()?

谢谢

最佳答案

一个可能的选择是创建一个进程 setuid通过设置 s 位。

例如

chmod +s myExectuable

但是,这会带来严重的安全隐患,因为该进程随后会以 root 身份运行 - 并伴随着随之而来的所有危险。如果您确实信任用户空间应用程序,则只有一个选择,即使如此,也是有风险的。

我认为在不破解内核的情况下更改 sysfs 的默认所有权和权限是不可能的,即使这样也会很棘手:sysfs 与 Linux 驱动程序模型的对象模型错综复杂地连接在一起。

您可能会更幸运地获得 /dev/ 上的权限。

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

关于arm - 在以非 root 用户身份运行的程序上通过 sysfs、mmap 或设备驱动程序控制 GPIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958827/

相关文章:

您能告诉我如何替换 ARM 架构 v7 中辅助 cpu 的重置 vector 吗?

ios - 是否有同时支持armv7和arm64的GoogleAnalyticsServicesIOS sdk?

linux-kernel - 已安装触摸屏和驱动程序但 tslib 无法校准

linux - 如何使脚本在 init 后作为启动脚本在 buildroot 中运行

go - 在 Raspberry Pi 上使用 GPIO 使用哪个包?

c - 解码二进制信号

c - 为什么程序对 Xilinx 定时器驱动程序中的只读定时器中断状态寄存器执行写访问

c - SD卡无法读写STM32f4

linux-kernel - Linux 内核引导方法 预构建的 rootfs

c++ - 使用Raspberry PI GPIO-我是否需要虚拟/抽象/接口(interface)类?