我正在尝试为Linux编写网络设备驱动程序。我拥有的设备具有可用的API,该API使我可以通过用户空间中存在的共享对象来访问所需的所有功能。
我想编写一个网络驱动程序,以便可以使设备显示为CAN接口。但是,为了与设备进行交互,我需要使用用户空间中存在的特定共享对象。
我需要网络设备驱动程序的原因是公开可以通过SocketCAN实用程序进行交互的CAN接口。
有没有办法可以在用户空间中编写网络设备驱动程序?或者,对我来说,构造解决方案的最佳方法是什么?
Tl;博士
需要为只能通过公开的提供API的共享对象从用户空间与之交互的设备编写设备驱动程序。我需要将设备显示为网络接口,以便利用SocketCAN实用程序和与Linux中的CAN接口通信的其他应用程序。
我在这里有什么选择?我能做什么?
谢谢!
因此,您是说内核中根本没有用于网络设备的驱动程序,并且只能通过某些用户空间库进行访问?在你提到的应该与您的网络设备通过将通信这种情况下,共享库的内存映射你的/ dev / MEM文件,以便能够读/写硬件寄存器。或者也许通过使用一些UIO。
因此,您的驱动程序也应该在用户空间中开发...那么您应该问的实际问题是如何从用户空间使用内核CAN API?首先有可能吗?对于答案,我想您应该查看Documentation / networking / can.txt。如果答案是“否”(意味着您不能从用户空间公开CAN接口),那么您还应该开发一些内核驱动程序,该驱动程序将与您的用户空间部分进行交互,从而公开CAN接口。
在理想情况下,整个驱动程序体系结构将如下所示:
但是您需要使用一些(专有的,如果我理解正确的话)共享库API与您的设备进行交互。因此,我建议您使用下一个驱动程序体系结构,如下图所示:
概括地说,您的应用程序和驱动程序都做一个垫片SocketCAN API和共享库API之间。
因此,您需要开发2个组件:
最后一个问题是要使用哪个内核API在内核空间驱动程序和用户空间应用程序之间交互(图片上标记为IPC)。严格取决于两个之间要发送的数据类型,要发送的数据量,以及哪种发送方式最适合您的任务。它也可能取决于您的共享库API:您可能不想花费大量的CPU时间来转换消息格式(因为您已经使用此驱动程序体系结构进行了三重 上下文切换,这对性能并不是很好)。因此它可能应该是面向数据包的,例如Netlink。
接下来的阅读对于确定使用哪个IPC可能很有用:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句