首页 > 解决方案 > 如何使用 SPI 编写网络设备驱动程序?

问题描述

我已经使用 rust 在用户空间中为NRF24L01+ 收发器实现了一个设备驱动程序。用户空间驱动程序使用内核 spi 接口驱动程序。将驱动程序编写为内核模块似乎非常困难,因为在linux 设备驱动程序中找到的linux/netdevice.h文档似乎已经过时(或者我不够聪明,无法理解复杂的细节)。

慕尼黑工业大学的一个新项目提议使用vfio。据我了解,这种类型的驱动程序实现使用 iommu 来管理设备对受保护内存区域的隔离。“Project Ixy”使用网络设备作为块设备,因此可以映射。SPI 是不同的,因为它是一种流协议。

我的问题是,是否可以将用户空间 spi 网络设备驱动程序集成到 linux 网络堆栈中,例如让所有协议等都由网络堆栈处理。是否可以使用与 Project Ixy 类似的方法,例如在内核空间中有一个小组件,为了安全而隔离,为用户空间搭建“桥梁”?

标签: linuxdriverspi

解决方案


我认为有两种可能:

  1. 使用 TAP 接口
  2. 在用户空间和内核空间之间编写自己的“桥接”接口,例如 TAP

如果类似以太网的接口对您来说已经足够了 - 然后使用 TAP。我的意思是 TAP 提供了将物理层移动到用户空间的功能。在您的情况下,它可以像这样工作:SPI 接收到的数据可以推送到 TAP 接口到 linux 网络堆栈。从 TAP 接口(来自 Linux 网络堆栈)接收的数据可以通过 SPI 推送。那是你想要的吗?

如果类似以太网的接口(如 TAP 那样)对您来说还不够——您可以基于 TAP 源代码在内核空间中编写自己的接口。


推荐阅读