我有一个可能有buggy的硬件和一个可能有buggy的用户空间驱动程序,它依赖于vfio-pci内核驱动程序。我想在不处理硬件的情况下测试驱动程序。
我认为理想的解决方案应该是这样的:运行除硬件(应用程序、用户空间驱动程序、VFIO驱动程序)之外的整个堆栈,并拦截VFIO驱动程序决定发送到硬件的所有内容。然后,我可以验证硬件是否获得了正确的信息--重置是否在预期的时间发生,DMA是否发送到正确的地址,等等。
我猜我正在寻找一种类似于模拟设备的东西,它可以让我在vfio-pci下运行用户空间代码,而不是运行硬件。这样的事情真的存在吗?
发布于 2018-02-04 21:34:38
使用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 answer有一些非常有用的提示,here's是一个不错的教程。
https://stackoverflow.com/questions/48602357
复制相似问题