2015-10-17 73 views
3

我正在尝试为Linux编写网络设备驱动程序。我拥有的设备具有可用的API,允许我通过存在于用户空间中的共享对象访问我需要的所有功能。Linux内核设备驱动程序需要访问用户空间中的共享对象

我想写一个网络驱动程序,这样我可以使设备显示为CAN接口。但是,为了与设备进行交互,我需要使用用户空间中存在的特定共享对象。

我需要一个网络设备驱动程序的原因是公开一个可以通过SocketCAN实用程序进行交互的CAN接口。

有没有一种方法可以在用户空间中编写网络设备驱动程序?或者什么是我设计解决方案的最佳方式?

铊;博士

需要写一个设备驱动程序,其用于仅可使用用户空间经由供给共享对象暴露所述API交互的装置。我需要将设备显示为网络接口,以便利用SocketCAN实用程序以及与Linux中的CAN接口进行通信的其他应用程序。

我在这里有什么选择?我能做什么?

谢谢!

+0

首先,感谢你这么多的信息和输入。我担心我会因为问这样一个问题而被装瓶。根据我的理解,没有办法从用户空间创建CAN网络设备。它与内核中的任何其他net_device元素基本相同,其中一些标志被更改为CAN设备。我需要做的是创建一个类似于以太网卡或usb-ethernet适配器的net_device,问题是不是通过PCI或USB写入硬件寄存器,而是与设备通信的唯一方式是通过这个SO文件 – Thomas

+0

将我的意见转移到答案上,为我所说的添加了一些内容。 –

回答

3

所以你说的是在内核中根本没有驱动程序用于你的网络设备,它只能通过一些用户空间库访问?在这种情况下,您提到的共享库应通过memory mapping文件与您的网络设备进行通信,以便能够读取/写入硬件寄存器。或者也许使用一些UIO

因此,您的驱动程序也应该在用户空间中开发......那么您应该问的实际问题是如何在用户空间中使用内核CAN API?首先,它有可能吗?对于答案,我想你应该看看Documentation/networking/can.txt。如果答案是“否”(意味着你不能从用户空间暴露CAN接口),那么你应该开发一些内核驱动,它将与你的用户空间部分交互,暴露出CAN接口。

在理想的世界整个驱动器架构是这样的:

Ideal driver architecture

但你需要使用一些(proprietary,如果我理解正确的话),共享库API与您的设备进行交互。所以,我建议你使用一个驱动架构,它描绘下面的图片:

  • 蓝色颜色代表的是需要开发的部分
  • 品红是已经存在的代码

Proposed driver architecture

概括地说,您的应用程序和驱动程序都作出shim SocketCAN API和共享之间库API。

所以,你需要开发两个部分组成:

  1. 驱动程序(内核侧)。这是负责:
    • 交谈SocketCAN公用事业
    • 说你的用户空间应用程序
  2. 应用程序(在用户空间);它可能应该是daemon,因为它会不断运行。这是负责:
    • 交谈,共享库
    • 说你的驱动程序

最后一个问题仍然是使用的内核API到内核空间的驱动程序和用户之间的互动空间应用(图片上标记为IPC)。这严格取决于您要在两种数据之间发送哪种数据,您需要发送多少数据以及哪种发送方式最适合您的任务。它也可能取决于你的共享库API:你可能不想花费大量的CPU时间来转换消息格式(因为你已经有这个驱动程序架构的三重context switching,这对性能来说并不是很好)。所以它可能应该是面向分组的,比如Netlink

下一页阅读可以找出要使用的IPC有用:

+0

这正是我想到的,但是你以这样一种很好的方式解决了这个问题。我是编写内核代码的新手,我想确保我的方法是正确的,非常感谢您的答复! – Thomas

相关问题