vfio内核实现分析-(6)将io暴露到userspace
来源:互联网 发布:java中socket编程实例 编辑:程序博客网 时间:2024/06/05 15:52
六、将io暴露到userspace
Io暴露到userspace比较简单,只是把io物理地址remap到userspace,对于pci设备包括pci config space、bar等。
在userspace可按照如下方式访问io区域:
/* Get a file descriptor for the device */device = ioctl(group, VFIO_GROUP_GET_DEVICE_FD, "0000:06:0d.0");/* Test and setup the device */ioctl(device, VFIO_DEVICE_GET_INFO, &device_info);for (i = 0; i < device_info.num_regions; i++) {struct vfio_region_info reg = { .argsz = sizeof(reg) };reg.index = i;ioctl(device, VFIO_DEVICE_GET_REGION_INFO, ®);/* Setup mappings... read/write offsets, mmaps * For PCI devices, config space is a region */}
首先分析ioctl(device, VFIO_DEVICE_GET_REGION_INFO, ®),经device fd对应的struct file_operations vfio_device_fops{.ioctl} ==> struct vfio_device{vfio_device_ops{.ioctl}} :
==>function vfio_pci_ioctl
Pci config space、pci bar等index定义:
这里分析pci bar,其他的io region重映射方式类似;
==>VFIO_PCI_INDEX_TO_OFFSET
Pci bar对应的offset只是index <<40,而当userspace通过mmap、read/write等访问对应区域时,对于传入的参数ppos,ppos低40位存储了实际的偏移量,ppos >> 40即可得到pci bar对应的index,有了这个index,再通过pci_resource_start、pci_resoucre_end、pci_resource_len等就可得到pci bar io region对应的开始地址、结束地址、长度等信息,查看mmap实现:
==>vfio_pci_mmap
Line 846之所以是(VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)而不是(VFIO_PCI_OFFSET_SHIFT)是因为vma->vm_pgoff表示的是页粒度的偏移量(offset of the area in the file, in pages)。
Line 897得到实际要访问的io区域,最后remap_pfn_range负责建立该物理区域的页表。
- vfio内核实现分析-(6)将io暴露到userspace
- vfio内核实现分析-(5)将DMA暴露到userspace
- vfio内核实现分析-(7)将中断暴露到userspace
- vfio内核实现分析-(1)基础知识
- vfio内核实现分析-(2)相关内核组件及数据结构概图
- vfio内核实现分析-(3)container,group, device设备入口
- vfio内核实现分析-(4)各组件之间如何关联
- zynq petalinux userspace IO
- vfio 通过VFIO_DEVICE_GET_REGION_INFO得到io信息,然后mmap到user space使用
- dpdk使用intel-82599网卡SRIOV的VF时,需要将VF网卡绑定到vfio
- vfio
- VFIO
- linux内核分析--异步io(一)
- linux内核分析--异步io(二)
- linux内核分析--异步io(三)
- linux内核分析--异步io(一)
- linux内核分析--异步io(二)
- linux内核分析--异步io(三)
- MVC 自定义验证
- 学习 Mars 老师 Android 开发视频教程笔记之01_06 Android 常用控件
- Android中获取ROM和SD卡剩余可用空间大小
- GCD&LCM-求最大公约数&最小公倍数
- jquery-easyui-1.4.4 汉化版
- vfio内核实现分析-(6)将io暴露到userspace
- Android 零散学习笔记
- 二进制与格雷码之间的转换---矩阵表示
- 数据库原理SQL简述
- 字节序(byte order)和位序(bit order)
- TextInputLayout 的简单使用
- redis详解
- 设计模式学习——单例模式
- maven构建web项目