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

时间:2017-10-24 14:54:12

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

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

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

2 个答案:

答案 0 :(得分:0)

GNU C库将函数调用(例如readwriteioctl)直接转发给内核。这些函数只是系统调用的非常薄的包装器。您可以使用内联汇编自己调用内核,但这很少有用。所以在这个意义上,与内核驱动程序的所有交互都将通过这些glibc函数。

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

答案 1 :(得分:0)

在ARM中:

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

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

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

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

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

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

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

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

相关问题