为什么 GPIO 不能是来自用户 space 的 accessed/changed?

Why can't the GPIO be accessed/changed from User space?

这可能被认为是一个幼稚的问题。

我习惯于裸机编程,我手动更改寄存器值以便写入 GPIO。相反,我在需要信息时读取那些相同的寄存器。

我最近转向嵌入式 linux。我已经说过,现在无法通过用户 space 中的代码 运行 来处理 GPIO。**我可以想象这可能是某些 security/sanity 原因,但我不能看见。 为什么不能在 GPIO 中使用用户 space read/write 的代码? 关于可能由此引起的问题的示例会很棒。

** 我知道 libraries/APIs 可以让您处理来自用户 space 的 GPIO,我正在学习使用它们。我的问题纯属好奇。

在某些平台上可以,但通常会避免。

通常 Linux 在硬件上运行,MMU 提供 page-level 内存保护,并将虚拟地址 space 重新映射到物理地址。

要从用户空间访问 memory-mapped GPIO,您需要配置 MMU 以将寄存器硬件地址映射到所需进程的虚拟地址 space,并且您需要启用对该页面的读取 and/or 写入权限。

但问题是粒度通常很差 - 内存页可能大约为 4 KB,而 GPIO 引脚的行为由几个不同寄存器中的几个不同位控制。因此不可能将单个 pin 暴露给给定进程。

此外,从用户那里执行此操作space 需要了解 GPIO 在给定平台上如何工作的精确硬件细节,而这些信息通常更适合属于驱动程序。

在某些情况下使用 sysfs 接口太慢,例如尝试 bit-bang 一些较慢的接口。但通常在这些情况下,而不是尝试直接从 userspace 处理 GPIO,而是编写一个内核模块,它从内核 space 执行 bit-banging,然后是 userspace 使用系统调用将整个中高级操作请求传递给内核。