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

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

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

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

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

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

我;博士

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

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

谢谢!

最佳答案

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

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

在理想世界中,整个驱动程序架构如下所示:

Ideal driver architecture

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

  • blue 颜色代表需要开发的部分
  • ma​​genta 用于已经存在的代码

Proposed driver architecture

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

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

  1. 驱动程序(在内核端)。它负责:
    • SocketCAN交谈公用事业
    • 与您的用户空间应用程序交谈
  2. 应用程序(在用户空间);它可能应该是 daemon ,因为它会一直运行。它负责:
    • 与共享图书馆交谈
    • 与您的司机交谈

最后一个问题是使用哪个内核 API 来在内核空间驱动程序和用户空间应用程序之间进行交互(在图片上标记为 IPC)。这严格取决于您要在两者之间发送哪种数据,您要发送多少数据,以及哪种发送方式最适合您的任务。它还可能取决于您的共享库 API:您可能不想花费太多 CPU 时间来转换消息格式(因为您已经有了 triple context switching 与此驱动程序架构,这不是非常适合性能)。所以它可能应该是面向数据包的东西,比如 Netlink .

接下来的阅读有助于找出要使用的 IPC:

关于Linux 内核设备驱动程序需要访问用户空间中的共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33192312/

相关文章:

linux - Linux中用户级线程的抢占式调度是如何实现的?

c - 错误 : implicit declaration of function 'create_proc_read_entry' [-Werror=implicit-function-declaration]

c - 致力于对链表进行排序,用 c 编写,然后为内核输出

linux - 通过 x86 PAT 表将内存设置为不可缓存

linux - 使用 bash 脚本提取文件——发生错误

Linux Mint Tkinter 透明窗口

linux - 强制linux只能使用4G以上的内存?

c - 这段代码中是否存在竞争条件的可能性?

python - atom : hydrogen installed, 但代码未运行(在 macOS 上)

c - 如何在 vxworks 6.7 中设置 wdb 进行内核前调试?