linux - 如何使用 SPI 编写网络设备驱动程序?
问题描述
我已经使用 rust 在用户空间中为NRF24L01+ 收发器实现了一个设备驱动程序。用户空间驱动程序使用内核 spi 接口驱动程序。将驱动程序编写为内核模块似乎非常困难,因为在linux 设备驱动程序中找到的linux/netdevice.h文档似乎已经过时(或者我不够聪明,无法理解复杂的细节)。
慕尼黑工业大学的一个新项目提议使用vfio。据我了解,这种类型的驱动程序实现使用 iommu 来管理设备对受保护内存区域的隔离。“Project Ixy”使用网络设备作为块设备,因此可以映射。SPI 是不同的,因为它是一种流协议。
我的问题是,是否可以将用户空间 spi 网络设备驱动程序集成到 linux 网络堆栈中,例如让所有协议等都由网络堆栈处理。是否可以使用与 Project Ixy 类似的方法,例如在内核空间中有一个小组件,为了安全而隔离,为用户空间搭建“桥梁”?
解决方案
我认为有两种可能:
- 使用 TAP 接口
- 在用户空间和内核空间之间编写自己的“桥接”接口,例如 TAP
如果类似以太网的接口对您来说已经足够了 - 然后使用 TAP。我的意思是 TAP 提供了将物理层移动到用户空间的功能。在您的情况下,它可以像这样工作:SPI 接收到的数据可以推送到 TAP 接口到 linux 网络堆栈。从 TAP 接口(来自 Linux 网络堆栈)接收的数据可以通过 SPI 推送。那是你想要的吗?
如果类似以太网的接口(如 TAP 那样)对您来说还不够——您可以基于 TAP 源代码在内核空间中编写自己的接口。
推荐阅读
- rust - serde 如何将字符串中的值转换为类型
- apache-kafka - Kafka AdminClient listTopics:有没有办法忽略 kstreams 主题?
- vue.js - VueJs - 删除动态创建的子组件总是删除最后一个
- haskell - Haskell 函数中的“非穷举模式”
- amazon-web-services - 加密 AWS 参数存储值的用例是什么?
- c# - ASP.NET Core,依赖注入 - 无法解析服务
- elasticsearch - 如何处理 elasticsearch-curator 日志文件大小?
- javascript - 如何在 React Slick 滑块中为自动播放添加初始延迟?
- python - Pytest + Multiprocessing Queue 不能很好地结合在一起
- docker - 删除了 Kubernetes 部署,但 Node(docker) 容器不断地重新创建自己