Linux内核设备驱动程序需要访问用户空间中的共享对象
作者:互联网
我正在尝试为Linux编写网络设备驱动程序.我拥有的设备具有可用的API,该API使我可以通过用户空间中存在的共享对象来访问所需的所有功能.
我想编写一个网络驱动程序,以便可以使设备显示为CAN接口.但是,为了与设备进行交互,我需要使用用户空间中存在的特定共享对象.
我需要网络设备驱动程序的原因是公开可以通过SocketCAN实用程序进行交互的CAN接口.
有没有办法可以在用户空间中编写网络设备驱动程序?或者,对我来说,构造解决方案的最佳方法是什么?
Tl;博士
需要为只能通过公开的提供API的共享对象从用户空间进行交互的设备编写设备驱动程序.我需要将设备显示为网络接口,以便利用SocketCAN实用程序和与Linux中的CAN接口通信的其他应用程序.
我在这里有什么选择?我能做什么?
谢谢!
解决方法:
因此,您是说内核中根本没有用于网络设备的驱动程序,并且只能通过某些用户空间库进行访问?在这种情况下,您提到的共享库应通过memory mapping的/dev/mem文件与网络设备通信,以便能够读取/写入硬件寄存器.或使用一些UIO.
因此,您的驱动程序也应该在用户空间中开发…那么您应该问的实际问题是如何从用户空间使用内核CAN API?首先有可能吗?对于答案,我猜您应该查看Documentation/networking/can.txt.如果答案为“否”(意味着您不能从用户空间公开CAN接口),那么您还应该开发一些内核驱动程序,该驱动程序将与用户空间部分进行交互,公开CAN接口.
在理想情况下,整个驱动程序体系结构将如下所示:
但是您需要使用一些共享库API(如果我理解正确,则为proprietary)与您的设备进行交互.因此,我建议您使用下一个驱动程序体系结构,如下图所示:
>蓝色代表需要开发的零件
>洋红色适用于已经存在的代码
简而言之,您的应用程序和驱动程序在SocketCAN API和共享库API之间都产生了shim.
因此,您需要开发2个组件:
>驱动程序(在内核方面).它负责:
>与SocketCAN公用程序通话
>与您的用户空间应用程序对话
>应用程序(在用户空间中);它可能应该是daemon,因为它将一直运行.它负责:
>与共享库交谈
>与司机交谈
最后一个问题是要使用哪个内核API在您的内核空间驱动程序和用户空间应用程序之间进行交互(在图中标记为IPC).它严格取决于两个之间要发送的数据类型,要发送的数据量,以及最适合您任务的发送方式.它也可能取决于您的共享库API:您可能不想花费大量的CPU时间来转换消息格式(因为您已经拥有使用该驱动程序体系结构的三重context switching,这对性能并不是很好).因此,可能应该是面向数据包的内容,例如Netlink.
接下来的阅读对于确定使用哪个IPC可能很有用:
> Kernel Space – User Space Interfaces
> Linux kernel interfaces
标签:can-bus,kernel,linux-kernel,linux-device-driver,linux 来源: https://codeday.me/bug/20191027/1947092.html