如何使用 SPI 编写网络设备驱动程序?
How do I write a network device driver using SPI?
我已经为 NRF24L01+ transceiver in userspace using rust. The userspace driver makes use of the kernel spi interface driver. Writing the driver as kernel module seems incredibly hard, as the documentation for linux/netdevice.h as found in linux device drivers 实现了一个设备驱动程序,似乎已经过时(或者我不够聪明,无法理解复杂的细节)。
一个新的project from the TU Munich proposes the use of vfio。根据我的理解,这种类型的驱动程序实现使用 iommu 来管理对设备受保护内存区域的隔离。 "Project Ixy"使用网络设备作为块设备,因此可以映射。 SPI 是不同的,因为它是一种流协议。
我的问题是,是否可以将用户 space spi 网络设备驱动程序集成到 linux 网络堆栈中,例如让网络堆栈处理所有协议等。是否可以使用与 Project Ixy 类似的方法,比如在内核 space 中有一个小组件,它是为了安全而隔离的,它构建了一个 "bridge" 到用户空间?
我认为有两种可能:
- 使用 TAP 界面
- 编写自己的 "bridging" 界面,例如用户 space 和内核 space
之间的 TAP
如果类似以太网的接口对您来说足够了 - 那么请使用 TAP。我的意思是 TAP 提供将物理层移至用户 space 的功能。在你的情况下,它可以像这样工作:SPI 接收到的数据可以被推送到 TAP 接口到 linux 网络堆栈。您可以通过 SPI 推送从 TAP 接口(来自 Linux 网络堆栈)接收的数据。那是你想要的吗?
如果类似以太网的接口(如 TAP)对您来说还不够 - 您可以根据 TAP 源代码在内核中编写自己的接口 space。
我已经为 NRF24L01+ transceiver in userspace using rust. The userspace driver makes use of the kernel spi interface driver. Writing the driver as kernel module seems incredibly hard, as the documentation for linux/netdevice.h as found in linux device drivers 实现了一个设备驱动程序,似乎已经过时(或者我不够聪明,无法理解复杂的细节)。
一个新的project from the TU Munich proposes the use of vfio。根据我的理解,这种类型的驱动程序实现使用 iommu 来管理对设备受保护内存区域的隔离。 "Project Ixy"使用网络设备作为块设备,因此可以映射。 SPI 是不同的,因为它是一种流协议。
我的问题是,是否可以将用户 space spi 网络设备驱动程序集成到 linux 网络堆栈中,例如让网络堆栈处理所有协议等。是否可以使用与 Project Ixy 类似的方法,比如在内核 space 中有一个小组件,它是为了安全而隔离的,它构建了一个 "bridge" 到用户空间?
我认为有两种可能:
- 使用 TAP 界面
- 编写自己的 "bridging" 界面,例如用户 space 和内核 space 之间的 TAP
如果类似以太网的接口对您来说足够了 - 那么请使用 TAP。我的意思是 TAP 提供将物理层移至用户 space 的功能。在你的情况下,它可以像这样工作:SPI 接收到的数据可以被推送到 TAP 接口到 linux 网络堆栈。您可以通过 SPI 推送从 TAP 接口(来自 Linux 网络堆栈)接收的数据。那是你想要的吗?
如果类似以太网的接口(如 TAP)对您来说还不够 - 您可以根据 TAP 源代码在内核中编写自己的接口 space。