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

汤玛士

我正在尝试为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个组件:

  1. 驱动程序(在内核方面)。它负责:
    • SocketCAN实用程序交谈
    • 与您的用户空间应用程序对话
  2. 应用程序(在用户空间中);它可能应该是守护进程,因为它将不断运行。它负责:
    • 与共享库交谈
    • 跟你的司机说话

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Linux设备驱动程序访问控制

PCIe驱动程序-用户空间如何访问它?

内核驱动程序从用户空间读取正常,但回写始终为0

在用户空间中实现Linux字符驱动程序

IOCTL Linux设备驱动程序

Linux内核设备驱动程序,将DMA从设备插入用户空间内存

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

内置的内核驱动程序还需要设备树吗?

在Linux内核模块(驱动程序)关键部分等待用户空间输入

观察内核空间中的硬盘写入(带有驱动程序/模块)

音频驱动程序应存在于Linux内核中,但无法识别设备

Linux设备驱动程序3rd Ed和3.2内核

为什么同时需要x服务器和linux内核的驱动程序?

确定是否可以在OSX的用户空间中编写HID设备驱动程序的最佳方法是什么?

在Linux内核空间驱动程序中为USB运行供应商命令

在linux设备驱动程序中注册级别的访问

如何为USB-HID设备使用Linux内核驱动程序绑定/取消绑定接口?

Linux:以独立方式编译内核设备驱动程序

SATA:基本支持需要哪些linux内核驱动程序?

linux内核驱动程序调试日志

Linux内核驱动程序-SPI如何识别SPI设备?

访问内核模式驱动程序中的用户模式内存

如何从内核访问在用户空间中创建的节点?

Linux字符设备驱动程序问题

Linux内核中的WS2812设备驱动程序

将设备驱动程序编译到内核

用户空间中的串行驱动程序

如何在内核空间中使用 i2c 驱动程序

linux 设备驱动程序文档