Linux内核设备驱动程序需要访问用户空间中的共享对象

时间:2015-10-17 22:36:53

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

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

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

我需要网络设备驱动程序的原因是暴露可以通过SocketCAN实用程序与之交互的CAN接口。

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

铊;博士

需要为设备编写设备驱动程序,该驱动程序只能通过提供的公开API的共享对象与用户空间进行交互。我需要将设备显示为网络接口,以便利用SocketCAN实用程序和其他与Linux中的CAN接口通信的应用程序。

我有什么选择?我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

在理想世界中,整个驱动程序架构看起来像这样:

Ideal driver architecture

但是你需要使用一些(proprietary,如果我理解的话)共享库API来与你的设备进行交互。所以我建议你使用下一个驱动程序架构,如下图所示:

  • 蓝色颜色代表需要开发的部件
  • magenta 适用于现有代码

Proposed driver architecture

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

所以你需要开发两个组件:

  1. 驱动程序(在内核端)。它负责:
    • SocketCAN实用程序交谈
    • 与您的用户空间应用程序交谈
  2. 应用程序(在用户空间中);它可能应该是daemon,因为它会不断运行。它负责:
    • 与共享库交谈
    • 与司机交谈
  3. 最后一个问题是用于在内核空间驱动程序和用户空间应用程序之间进行交互的内核API(在图片上标记为IPC)。它严格依赖于您要在两者之间发送哪种数据,以及您希望发送多少数据,以及哪种发送方式最适合您的任务。它可能还取决于您的共享库API:您可能不希望花费大量CPU时间来转换消息格式(因为您已经使用此驱动程序体系结构 triple context switching表现并不是很好。)所以它可能应该是面向数据包的东西,比如Netlink

    下一步阅读有助于确定使用哪种IPC: