我希望从I2C中读取处理器,并将数据存储在嵌入式系统中。当我一直在研究解决方案时,我已经被介绍给Linux设备驱动程序以及GNU C库。对于许多操作,您可以使用基本的Linux驱动程序执行,也可以使用基本的glibc系统调用来执行。我有点搞不懂什么时候应该用一个而不是另一个。这两个接口都可以从用户空间访问。
什么时候应该使用内核驱动程序来访问像I2C或USB这样的设备,以及何时应该使用GNU库系统功能?
发布于 2017-10-24 16:19:19
GNU库将函数调用(如read、write、ioctl )直接转发给内核。这些函数只是系统调用的非常薄的包装器。您可以使用内联程序集单独调用内核,但这很少有帮助。因此,在这个意义上,所有与内核驱动程序的交互都将经历这些glibc函数。
如果您有关于特定接口和它们的权衡的问题,您需要明确地命名它们。
发布于 2017-10-26 04:23:33
手臂:
特权状态被内置到处理器中,并通过程序集命令进行更改。存储器保护单元(芯片的一部分)被配置为根据特权状态不允许访问任意内存范围。
在Linux内核中,所有物理内存都是特权的--用户空间中的内存地址是虚拟(假)地址,在特权模式下转换为真实地址一次。
因此,要访问特权内存范围,机制就像一个函数调用--设置指示需要什么的参数,然后生成一个('SVC')- -一个中断函数,它从用户空间删除程序的控制,将其交给内核。内核查看您的参数并执行所需的操作。
标准库基本上可以简化整个过程。
驱动程序创建物理内存地址的接口,并通过SVC调用和传递的任何“参数”提供API。
如果物理内存不是由驱动程序保留的,内核通常不允许任何人访问它。
访问您没有特权的物理内存将导致“总线错误”。
顺便说一句:您可以使用像UIO这样的驱动程序将物理内存放入用户空间。
https://stackoverflow.com/questions/46913756
复制相似问题