我试图了解 vfio 如何在 pci 上工作。我已阅读https://www.kernel.org/doc/Documentation/vfio.txt,并且正在根据它编写测试。在某些时候,我的代码如下所示:
/* Get pci device information (number of regions and interrupts...) */
ret = ioctl(vfio_dev_fd, VFIO_DEVICE_GET_INFO, &device_info);
if (ret) {
printf(" %s cannot get device info, "
"error %i (%s)\n", pci_addr, errno, strerror(errno));
close(vfio_dev_fd);
return -1;
}
printf ("found %d regions in the device\n", device_info.num_regions);
我不明白的是最后一个 printf 显示 9(九)个区域!查看我的 PCI 设备的配置空间,我可以看到:
cat /sys/bus/pci/devices/0000\:06\:00.0/config | hd
00000000 e4 14 81 16 00 04 10 00 10 00 00 02 10 00 00 00 |................|
00000010 04 00 de f3 00 00 00 00 04 00 df f3 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 28 10 6e 02 |............(.n.|
00000030 00 00 00 00 48 00 00 00 00 00 00 00 0a 01 00 00 |....H...........|
00000040
我是 PCI 新手,但我对此的解释是这块板上只有两个 BARS(0 和 2)。而且我认为 PCI 上的最大区域数(BAR?)是 6。
然而,有一点迹象表明我误解了一些东西:上面提到的内核文档指出:
对于 PCI 设备,配置空间是一个区域
所以这可能会导致我正在查看的主板有 3 个区域......仍然显示 9...... pci_vfio 的 PCI 区域是什么?它们是如何编号和访问的?...
谢谢。