linux内核空间共享,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接口.

在理想情况下,整个驱动程序体系结构将如下所示:

fldPH.png

但是您需要使用一些共享库API(如果我理解正确,则为proprietary)与您的设备进行交互.因此,我建议您使用下一个驱动程序体系结构,如下图所示:

>蓝色代表需要开发的零件

>洋红色适用于已经存在的代码

KZKtn.png

简而言之,您的应用程序和驱动程序在SocketCAN API和共享库API之间都产生了shim.

因此,您需要开发2个组件:

>驱动程序(在内核方面).它负责:

>与SocketCAN公用程序通话

>与您的用户空间应用程序对话

>应用程序(在用户空间中);它可能应该是daemon,因为它将一直运行.它负责:

>与共享库交谈

>与司机交谈

最后一个问题是要使用哪个内核API在您的内核空间驱动程序和用户空间应用程序之间进行交互(在图中标记为IPC).它严格取决于两个之间要发送的数据类型,要发送的数据量,以及最适合您任务的发送方式.它也可能取决于您的共享库API:您可能不想花费大量的CPU时间来转换消息格式(因为您已经拥有使用该驱动程序体系结构的三重context switching,这对性能并不是很好).因此,可能应该是面向数据包的内容,例如Netlink.

接下来的阅读对于确定使用哪个IPC可能很有用:

标签:can-bus,kernel,linux-kernel,linux-device-driver,linux

来源: https://codeday.me/bug/20191027/1947092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值