问题描述
这可能被认为是一个幼稚的问题。
我习惯于裸机编程,在这里我手动更改寄存器值以写入GPIO。相反,当需要信息时,我会读取相同的寄存器。
我最近转移到嵌入式Linux。我已经指出,现在无法通过在用户空间中运行的代码来处理GPIO。**我可以想象这可能是出于某种安全性/合理性的原因,但我看不到它。 为什么不能通过用户空间的代码在GPIO中读取/写入?一个可能由此引发的问题的例子很好。
**我知道使您可以从用户空间处理GPIO的库/ API,并且我正在学习使用它们。我的问题纯粹是出于好奇。
解决方法
在某些平台上可以,但是通常可以避免。
通常,Linux在具有MMU的硬件上运行,该MMU既提供页面级内存保护,又将虚拟地址空间重新映射为物理地址。
要从userpace访问内存映射的GPIO,您需要配置MMU以将寄存器硬件地址映射到所需进程的虚拟地址空间,并且需要启用对此的读取和/或写入访问。页面。
尽管如此,问题是粒度通常很差-内存页可能约为4 KB,而GPIO引脚的行为由几个不同寄存器中的几个不同位控制。因此,不可能将单个引脚暴露于给定的进程。
此外,从用户空间执行此操作还需要了解GPIO在给定平台上如何工作的确切硬件细节,而这些信息通常最好属于驱动程序。
在某些情况下,使用sysfs接口太慢,例如尝试对一些较慢的接口进行位冲击。但是通常在这些情况下,不是尝试直接从用户空间处理GPIO,而是编写了一个内核模块,该模块从内核空间进行位撞击,然后用户空间使用syscall将整个中高级操作请求传递给操作系统。内核。