本文将基于开源项目RIFFA,分析Linux系统下PCIE设备的内核驱动是如何实现的,为开发Linux PCIE驱动提供一个参考模板,同时也可作为研究PCIE软硬件交互流程的具体实例,加深对PCIE相关知识的理解。
该开源项目的地址为:https://github.com/KastnerRG/riffa
本文将在Ubuntu22.04下搭建一个QEMU的运行环境,并编译Linux内核源码,随后通过QEMU来调试Linux内核,用以辅助Linux内核的学习。
事实上,我在Ubuntu22.04和Ubuntu24.04下都试过了,流程上是一样的,但是Ubuntu24.04因为内核版本太新(至少对于在写这篇文章的时间点来说),踩了一些细节上的坑,最终调试效果并不好,所以我还是建议选用Ubuntu22.04。
本篇文章中,我会根据我目前的工作经验,并结合相关资料,从基本流程上简要地探究一下PCIE DMA操作的交互流程。
适用PCIE的设备有很多类型,典型的就是网卡、NVMe SSD、GPU,不同系统上细节也不同,因此我将以Linux为例,进行相关研究。
我们不需要过分追求某个细分主题下的详细内容,因为每个主题都很复杂,不是一篇文章就可以讲完的,本文旨在让你想通完成一个PCIE DMA的操作大体上都会经历什么。
本文旨在用纯软件的方法,来模拟真实的二层网络,我将采用Docker来模拟一台真实的主机,用OVS(Open vSwitch)来模拟一台真实的二层交换机,并构造一个稍有复杂性的网络拓扑。
注意,我所模拟出的网络,是可以和真实物理网络进行交互的,这其中的核心思想是将一台真实的主机看作一个网络,即在这台主机上利用纯软件的方法来构建一个网络。
本文不涉及任何编程实现,你只需要准备好VMware、Ubuntu22.04、Docker、OVS。
这比用网络模拟器好玩多了,因为无论是虚拟机还是Docker容器里,你都是真的可以跑你自己的东西的。