【问题标题】:Device Drivers vs the /dev + glibc Interface设备驱动程序与 /dev + glibc 接口
【发布时间】:2017-10-24 14:54:11
【问题描述】:

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

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

【问题讨论】:

    标签: linux-device-driver embedded-linux glibc


    【解决方案1】:

    GNU C 库将函数调用(例如 read、write、ioctl)直接转发到内核。这些函数只是系统调用的非常薄的包装器。您可以使用内联汇编自己调用内核,但这几乎没有帮助。所以从这个意义上说,所有与内核驱动的交互都会经过这些glibc函数。

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

    【讨论】:

    • 是什么阻止我在用户应用程序中包含正确的 glibc 文件并分配大量内存?如果它们都只是系统调用,那么内核空间有什么“特权”?这是如何管理的?
    • “通常,i2c 设备由内核驱动程序控制。但也可以通过 /dev 接口从用户空间访问适配器上的所有设备。”我什么时候会使用内核驱动程序与开发接口?大多数外围设备都有设备接口吗?
    【解决方案2】:

    在 ARM 中:

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

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

    因此,要访问特权内存范围,机制就像一个函数调用——你设置指示你想要什么的参数,然后创建一个 ('SVC')——一个中断函数,它从用户空间移除对程序的控制,把它交给内核。内核会查看您的参数并执行您需要的操作。

    标准库基本上使整个过程更容易。

    驱动程序创建物理内存地址的接口,并通过 SVC 调用及其传递的任何“参数”提供 API。

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

    访问您无权访问的物理内存会导致“总线错误”。

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

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2012-07-22
      相关资源
      最近更新 更多