QEMU设备直通pass through的地址映射转换

[内核:HVA]->[QEMU:HVA]的mmap地址映射

$ sudo cat /proc/2047239/maps | grep -i vfio
address                   perms offset  dev   inode                      pathname
7f4b5444a000-7f4b5445a000 rw-s 9da50000 00:0e 13037                      anon_inode:[vfio-device]
7f4b5445a000-7f4b5446a000 rw-s 9da40000 00:0e 13037                      anon_inode:[vfio-device]
7f4b5c00d000-7f4b5c01d000 rw-s 9da30000 00:0e 13037                      anon_inode:[vfio-device]

输出的信息依次为:
第一列:本段在虚拟内存中的地址范围。
第二列:本段的权限。
第三列:偏移地址,即指本段映射地址在文件中的偏移。
第四列:主设备号与次设备号。
第五列:文件索引节点号。
第六列:映射的文件名。

[HPA]->[内核:HVA] 的ioremap地址映射

$ sudo cat /proc/vmallocinfo | grep -i mmap
0xffffac75cb9f0000-0xffffac75cba01000   69632 vfio_pci_mmap+0x1a7/0x1f0 [vfio_pci] phys=0x000000009da30000 ioremap
0xffffac75cba40000-0xffffac75cba51000   69632 vfio_pci_mmap+0x1a7/0x1f0 [vfio_pci] phys=0x000000009da40000 ioremap
0xffffac75cbea0000-0xffffac75cbeb1000   69632 vfio_pci_mmap+0x1a7/0x1f0 [vfio_pci] phys=0x000000009da50000 ioremap

./Documentation/filesystems/proc.rst

1174 vmallocinfo
1175 ~~~~~~~~~~~
1176 
1177 Provides information about vmalloced/vmaped areas. One line per area,
1178 containing the virtual address range of the area, size in bytes,
1179 caller information of the creator, and optional information depending
1180 on the kind of area:
提供有关vmallocated/vmaped区域的信息。每个区域一行,
包含区域的虚拟地址范围、以字节为单位的大小、
创建者的调用方信息以及取决于区域类型的可选信息:
1181 
1182  ==========  ===================================================
1183  pages=nr    number of pages
1184  phys=addr   if a physical address was specified
1185  ioremap     I/O mapping (ioremap() and friends)
1186  vmalloc     vmalloc() area
1187  vmap        vmap()ed pages
1188  user        VM_USERMAP area
1189  vpages      buffer for pages pointers was vmalloced (huge area)
1190  N<node>=nr  (Only on NUMA kernels)
1191              Number of pages allocated on memory node <node>
1192  ==========  ===================================================
1193 
1194 ::

[QEMU:HVA]->[GPA]的IOMMU映射

memory_region_init_ram_device_ptr->
ram_block_notify_add->
notifier->ram_block_added(notifier, host, size, max_size)->

qemu_vfio_ram_block_added->
qemu_vfio_dma_map->
qemu_vfio_do_mapping->
ioctl(s->container, VFIO_IOMMU_MAP_DMA, &dma_map)

Host是需要开启IOMMU的,因为ioctl(s->container, VFIO_IOMMU_MAP_DMA, &dma_map)
用来关联[GPA]和[QEMU:HVA]的关系,通过VFIO的IOMMU_DOMAIN_UNMANAGED 类型domain,填充Host IOMMU的Host device对应的IO页表,具体流程如下:

ioctl(pdev.vfio.container, VFIO_IOMMU_MAP_DMA, &dma_map);
vfio_iommu_type1_ioctl
vfio_iommu_type1_map_dma
vfio_dma_do_map
vfio_pin_map_dma
vfio_iommu_map
iommu_map
__iommu_map
__iommu_map_pages
ops->map_pages
intel_iommu_map_pages
intel_iommu_map
__domain_mapping

在__domain_mapping里,将IOVA(即GPA)和HVA对应的物理地址HPA的PFN填充到IOMMU的二级翻译页表项的PTE中,实现GPA->HPA的转换。

这样Host device DMA访问GPA,就可以通过IOMMU找到HPA,从而进行DMA读写。

在这里插入图片描述

DMA内存分配和地址传递

DMA内存是有Guest driver通过dma_alloc_coherent等DMA API接口分配,由于Guest中没有开启IOMMU,多以dma_alloc_coherent分配的内存的物理地址GPA就是DMA地址。GPA地址被写到Host device的寄存器中,Host device从而可以访问GPA地址。

Guest不开启iommu的情况下,GPA作为DMA的IOVA地址,传递给Host上的device。
dma_alloc_coherent接口,由于没有开启IOMMU,所以直接将CPU虚拟地址对应的物理地址作为IOVA。
没有IO页表。

其他

在网卡中,
这个IOVA地址就是GPA。传递给Host device,用于DMA操作。
CPU访问GPA->HPA的转换是通过EPT硬件完成的。

Host device DMA访问vring,需要经过GPA->HPA的寻址。
Host是需要开启IOMMU的,因为ioctl(s->container, VFIO_IOMMU_MAP_DMA, &dma_map)
用来关联GPA和用户HVA的关系,通过VFIO的unmanaged类型domain,填充Host IOMMU的IO页表,这样Host device DMA访问GPA,就可以找到HPA,从而进行DMA读写。

DMA读通过driver notify硬件触发;
DMA写完成,通过device中断通知driver读,msix bar已经mmap给Guest了,Posted中断可以直接传递个vCPU处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

稀碎从零算法笔记Day7-LeetCode:罗马数字转整数

题型&#xff1a;字符串转化、找规律 链接&#xff1a;13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 …

【HTML】day01

列表 作用&#xff1a;布局内容排序整齐的区域。 列表分类&#xff1a;无序列表、有序链表、定义列表 无序列表 <ul><li>test</li><li>test</li><li>test</li><li><h1>h1</h1></li></ul><!DOCTYPE…

DolphinScheduler——奇富科技的调度实践

目录 一、技术架构 二、业务挑战 2.1 调度任务量大 2.2 运维复杂 2.3 SLA要求高 三、调度优化实践 3.1 重复调度 3.2 漏调度 3.3 Worker服务卡死 3.4 任务重复运行 四、服务监控 4.1 方法耗时监控 4.2 任务调度链路监控 五、用户收益 原文大佬的这篇调度系统案例…

【Gitee】创建第一个仓库并提交第一次代码

目录 第一步&#xff1a;注册登录 第二步&#xff1a;创建第一个仓库 1、我的工作台 → 创建我的仓库 2、填写内容 3、创建 第三步&#xff1a;第一次提交代码 1、参考资料 2、操作 2.1 idea创建项目 2.2 项目内容推送至远程 最后&#xff1a;平台相关资料库 第一步…

1.Zookeeper理论基础

1.Zookeeper的基本概念 是一个分布式应用协调框架 &#xff0c;java编写的。客户端 /服务端 的架构模式。CP设计(一致性&#xff0c;分区容错) 它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;服务注册服务、状态同步服务、集群管理、分布…

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

虽然写了不少前端代码,但是我真没搞懂什么是 JavaScript

追溯到 1998 年第一次拥有个人电脑开始&#xff0c;JavaScript 可能是我最早接触的编程语言&#xff0c;不过这么多年过去了&#xff0c;我现在又变得迷糊了&#xff0c;我反倒搞不清楚什么是 JavaScript 了。 一、历史 JavaScript最早是由Brendan Eich在1995年发明的。当时&…

SPC 之 I-MR 控制图

概述 1924 年&#xff0c;美国的休哈特博士应用统计数学理论将 3Sigma 原理运用于生产过程中&#xff0c;并发表了 著名的“控制图法”&#xff0c;对产品特性和过程变量进行控制&#xff0c;开启了统计过程控制新时代。 什么是控制图 控制图指示过程何时不受控制&#xff…

【pyinstaller打包记录】程序使用多进程,打包后,程序陷入死循环

简介 PyInstaller 是一个用于将 Python 程序打包成可执行文件&#xff08;可执行程序&#xff09;的工具。它能够将 Python 代码和其相关的依赖项&#xff08;包括 Python 解释器、依赖的模块、库文件等&#xff09;打包成一个独立的可执行文件&#xff0c;方便在不同环境中运行…

YOLOv8从入门到入土使用教程!(二)目标预测

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测&#xff01;模型训练教程参考下文&#xff1a; YOLOv8从…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数&#xff0c;比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类&#xff1a; 离散型随机变量&#xff1a;随机变量的取值为有限个。连续型随机变量&#xff1a;随机变量的取值是连…

线上问题——学习记录幂等判断失效问题分析

一、业务流程 上图是对save和saveScore两个接口的流程抽象&#xff0c;save是上传答题数据&#xff0c;saveScore则是上传答题分数&#xff0c;为保证幂等和防止并发调用&#xff0c;这两个接口都加了分布式锁&#xff08;还是两层哦&#xff09;。第一层使用的是不同的锁&…

【C++】STL简介 | STL六大组件 | string类 | string类对象操作

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的缺陷 5. 引出string类 6. 标准库中的string类 6.1 string类简介 6.2 string类对象的构造 6.3. string类对象的容量 6.4. string类对象的遍历 6.5. string类对象的修改 6.6. string类非成员函数 6.7. vs…

品优购首页制作

一&#xff0c;常用模块类名命名 二&#xff0c;快捷导航shortcut制作 三&#xff0c;header制作 3.1LOGO SEO优化 3.2 搜索模块定位 四&#xff0c; nav导航制作 五&#xff0c;footer底部制作 六&#xff0c;main主体模块制作 以前书写是模块化中的公共部分 main主体模块是…

GEE入门篇|图像分类(一):监督分类

在遥感中&#xff0c;图像分类是尝试将图像中的所有像素分类为有限数量的标记土地覆盖和/或土地利用类别。 生成的分类图像是从原始图像导出的简化专题图&#xff08;图 1&#xff09;&#xff0c; 土地覆盖和土地利用信息对于许多环境和社会经济应用至关重要&#xff0c;包括自…

鸿蒙开发,对于前端开发来说,究竟是福是祸呢?

提前声明&#xff1a; 先说好哈&#xff0c;不要一上来就开喷&#xff0c;好吧&#xff0c;不感兴趣的话你可以不用看下文直接划走&#xff0c;直接喷俺有点承受不住&#xff0c;心脏不好。如果你感兴趣&#xff0c;你可以先把这篇文章看完&#xff0c;看完后感觉俺讲的还挺有道…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

Linux - 基础IO

1、回顾 1.1、来段代码回顾C文件接口 hello.c写文件 #include <stdio.h> #include <string.h> int main() {FILE *fp fopen("myfile", "w");if(!fp){printf("fopen error!\n");}const char *msg "hello bit!\n";int …

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

在线客服系统部署ssl开启https无法自动获取提示消息解决办法

▇ 增加https无法收发消息&#xff1a; 严格按照教程修改 1./站点目录/public目录下,修改index.php define(whost,wss://kf.tpym.cn); define(wport,443); 2./站点目录/service 目录下,修改config.php // websocket 端口&#xff0c;客服系统网页会连这个端口 $websocket_…