设备驱动程序与 /dev + glibc 接口

Device Drivers vs the /dev + glibc Interface

我希望让处理器从 I2C 读取数据并将数据存储在嵌入式系统的 DDR 中。当我一直在寻找解决方案时,有人向我介绍了 Linux 设备驱动程序以及 GNU C 库。对于许多操作,您似乎可以使用基本的 Linux 驱动程序执行,您也可以使用基本的 glibc 系统调用执行。当一个应该用于另一个时,我有点困惑。用户 space 可以访问这两个界面。

何时应使用内核驱动程序访问 I2C 或 USB 等设备,何时应使用 GNU C 库系统函数?

GNU C 库将 readwriteioctl 等函数调用直接转发给内核。这些函数只是系统调用的非常薄的包装器。您可以使用内联汇编自行调用内核,但这几乎没有帮助。所以从这个意义上讲,所有与内核驱动程序的交互都会通过这些glibc函数。

如果您对特定接口及其权衡有疑问,您需要明确命名它们。

在 ARM 中:

特权状态 内置于处理器中,可通过汇编命令更改。内存保护单元是芯片的一部分,配置为根据特权状态禁止访问任意范围的内存。

在 Linux 内核的情况下,所有物理内存都是特权 - 用户空间中的内存地址是虚拟(假)地址,在特权模式下转换为真实地址。

因此,要访问特权内存范围,其机制就像一个函数调用 - 您设置参数以指示您想要什么,然后创建一个 ('SVC')- 一个中断函数,它会取消对来自用户空间的程序,将其提供给内核。内核查看您的参数并执行您需要的操作。

标准库基本上简化了整个过程。

驱动程序创建到物理内存地址的接口,并通过 SVC 调用和传递的任何 'arguments' 提供 API。

如果驱动程序没有保留物理内存,内核通常不会允许任何人访问它。

访问您无权访问的物理内存将导致 "bus error"。

顺便说一句:您可以使用类似 UIO 的驱动程序将物理内存放入用户空间。