当用户态程序需要使用pci设备的相关接口时,可借助于libpciaccess这一库函数。

1.source code

libpciaccess

2.how to use it?

passthrough.c
可以从该文件中学习libpciaccess的使用方法。

1
2
3
4
5
6
7
8
9
#include <pciaccess.h>

struct pci_device_iterator *iter;

error = pciaccess_init();

iter = pci_slot_match_iterator_create(NULL);

pci_device_probe(ptdev->phys_dev);

3.demo

3.1 pci_device_map_range

Map the specified memory range so that it can be accessed by the CPU.

已知IGD(Intel Graphix Device) bar0的前2MB空间为mmio。当需要在用户态程序读写mmio寄存器时,可以借助于pci_device_map_range,将物理上的2MB mmio空间映射到2MB的用户虚拟地址空间。最终,通过读写用户虚拟地址空间,就可以操作真实的mmio寄存器了。

具体用法可以参考passthrough.cinit_msix_table。其中,msix_table_readmsix_table_write需要重点关注。