UAPI 打开、绑定与 IOCTL 调用链
1. Legacy流程
1 | open("/dev/vfio/vfio") |
实际 attach与 SET_IOMMU顺序需遵循 UAPI示例和 backend状态。
2. Device ioctl
通用:
VFIO_DEVICE_GET_INFO;VFIO_DEVICE_GET_REGION_INFO;VFIO_DEVICE_GET_IRQ_INFO;VFIO_DEVICE_SET_IRQS;VFIO_DEVICE_RESET;VFIO_DEVICE_FEATURE。
随后可 read/write/mmap region。
3. argsz和flags
VFIO结构以 argsz支持 ABI扩展。用户应:
1.初始化 argsz;
2.检查返回 flags/capability chain;
3.必要时按所需大小重试;
4.忽略未知可跳过 capability。
不能假设所有 driver支持同一 feature。
4. Region offset
Device fd的 file offset编码 region index和内部 offset。PCI config、BAR、ROM、vendor region各有独立 index/flags。
5. IRQ
VFIO_DEVICE_SET_IRQS通过 index/start/count/flags:
- DATA_NONE/BOOL/EVENTFD;
- ACTION_MASK/UNMASK/TRIGGER。
MSI/MSI-X常把 eventfd数组关联 vector。
6. Feature
本树 Core处理 migration、migration state、DMA logging start/stop/report等 feature;PCI core另处理 low power和 VF token。是否可用由 device ops和 feature probe决定。
7. 错误
-EINVAL:argsz/flags/index/state;-ENODEV:device消失;-EBUSY:group不 viable或已绑定;-ENOTTY:不支持 ioctl;-EFAULT:用户指针;-ENOMEM:pin/map资源。
8. Compat
32位用户态在64位 kernel上通过 compat ioctl。所有用户 pointer和 size必须按 UAPI类型处理,不能复制内核私有结构布局。
正在加载留言…