【问题标题】:Why can't the GPIO be accessed/changed from User space?为什么不能从用户空间访问/更改 GPIO?
【发布时间】:2020-09-29 08:19:13
【问题描述】:

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

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

我最近转向嵌入式 linux。我已经指出,现在处理 GPIO 不能通过在用户空间中运行的代码来完成。** 我可以想象这可能是一些安全/健全的原因,但我看不到它。 为什么用户空间的代码不能在 GPIO 中读/写?一个可能导致的问题的示例会很棒。

** 我知道库/API 可以让您处理来自用户空间的 GPIO,并且我正在学习使用它们。我的问题纯粹是出于好奇。

【问题讨论】:

  • 我认为这是操作系统的作用,抽象底层硬件,防止你在直接访问时出错...你可以处理GPIO,但你不能直接访问注册并且必须使用 OS API。
  • 真的,您没有看到绕过操作系统轻松访问 GPIO 寄存器可能会搞砸流程吗?有很多方法可以让你的木板冒烟。

标签: embedded embedded-linux gpio


【解决方案1】:

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

Linux 通常在具有 MMU 的硬件上运行,该 MMU 提供页面级内存保护以及将虚拟地址空间重新映射到物理地址。

要从用户空间访问内存映射的 GPIO,您需要配置 MMU 以将寄存器硬件地址映射到所需进程的虚拟地址空间,并且您需要启用对其的读取和/或写入访问页面。

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

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

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

【讨论】:

  • 不,主要问题是在软件层面上搞乱了多任务操作系统以及损坏硬件的潜在风险。
  • @0andriy 你能举例说明硬件是如何损坏的吗?
  • 很容易。 GPIO 线连接到输出电流的硬件。一个将 GPIO 线切换到具有相反电流电位的 输出 模式。哎呀。
  • I/O 争用是一个规范违规,但很少致命。并且很容易使用 sysfs 接口,因此与问题有点切线。有更好的例子来说明你的论点,但这又与问题无关。
猜你喜欢
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
相关资源
最近更新 更多