繁体   English   中英

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

[英]Linux Kernel device driver needs access to shared object in userspace

我正在尝试为Linux编写网络设备驱动程序。 我所拥有的设备有一个可用的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:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM