我有一个可能有问题的硬件和一个可能有问题的用户空间驱动程序,它依赖于vfio-pci内核驱动程序。我想在不处理硬件的情况下测试驱动程序。
我认为理想的解决方案是:运行我的整个堆栈,除了硬件(应用程序,用户空间驱动程序,VFIO驱动程序)并拦截VFIO驱动程序决定发送到硬件的所有内容。然后我可以验证硬件是否正在获得正确的信息 - 重置是在预期的时间发生,DMA正在到达正确的地址等。
我想我正在寻找类似于模拟设备的东西,让我在vfio-pci下面运行用户空间代码,而不是运行硬件。这样的事情存在吗?
答案 0 :(得分:1)
使用Qemu,仿真设备变得非常简单。我经常用它做一些Linux内核研究。在Archlinux上,qemu-arch-extra
带有一堆机器:
$ qemu-system-arm -machine help
Supported machines are:
[..]
cubieboard cubietech cubieboard
emcraft-sf2 SmartFusion2 SOM kit from Emcraft (M2S010)
highbank Calxeda Highbank (ECX-1000)
imx25-pdk ARM i.MX25 PDK board (ARM926)
integratorcp ARM Integrator/CP (ARM926EJ-S)
kzm ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb Stellaris LM3S6965EVB
lm3s811evb Stellaris LM3S811EVB
mainstone Mainstone II (PXA27x)
midway Calxeda Midway (ECX-2000)
[and more...]
您的任务的一个好方法是为Qemu编写模拟PCI设备,并在那里进行测试。
由于有大量有关使用和扩展Qemu的优质材料,因此没有太多可以解释的内容。快速谷歌搜索显示了一些很好的资源。 This回答有一些超级有用的提示,here's是一个不错的教程。