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处理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 网络原理之Http

目录 1 前言2 什么是http的一次交互&#xff1f;3 理解“协议”二字4 认识URL4.1 简介4.2 URL的编码和解码(urlencode和urldecode) 5 抓包工具 fiddler6 http和https的区别7 http 头8 HTTP 状态码9 常见的 Http 服务器 1 前言 为什么要了解Http原理呢&#xff1f;因为http原理…

基于SSM SpringBoot vue个人博客网站

基于SSM SpringBoot vue个人博客网站 系统功能 首页 图片轮播 博客文章 搜索 登录注册 论坛 留言板 个人中心 我的收藏 后台管理 登录 个人中心 博客分类管理 博客文章管理 论坛管理 系统管理 管理员管理 注册用户管理 开发环境和技术 开发语言&#xff1a;Java 使用框架:…

实战经验分享:如何优化即时通讯应用的性能?

在当今移动互联网时代&#xff0c;即时通讯应用如雨后春笋般涌现&#xff0c;用户对即时通讯应用的性能和体验要求也越来越高。作为即时通讯开发领域的专家&#xff0c;我将分享一些优化即时通讯应用性能的实战经验&#xff0c;帮助开发者提升应用质量和用户满意度。 1. 优化网…

【Leetcode每日一刷】贪心算法| 45.跳跃游戏 II

1、45.跳跃游戏 II &#x1f984;解题思路&#xff1a; 这题还是比【55.跳跃游戏】难一些的。第一个版本只是说&#xff0c;求跳跃的范围&#xff0c;覆盖到了终点即可。这题则是&#xff0c;能保证覆盖范围到达终点&#xff0c;求的是最少跳几次&#xff0c;跳到终点。 这题…

289页初中级前端题助你拿下Offer,终局之战

HTML、CSS、JS三大部分都起什么作用&#xff1f; HTML内容层&#xff0c;它的作用是表示一个HTML标签在页面里是个什么角色&#xff1b;CSS样式层&#xff0c;它的作用是表示一块内容以什么样的样式&#xff08;字体、大小、颜色、宽高等&#xff09;显示&#xff1b;JS行为层…

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案&#xff0c;非法请求的限制第二种方案&#xff0c;缓存空值或者默认值第三种方案&#xff0c;使…

01、MongoDB -- 下载、安装、配置文件等配置 及 副本集配置

目录 MongoDB -- 下载、安装、配置 及 副本集配置启动命令启动 mongodb 的服务器&#xff08;单机和副本集&#xff09;启动单机模式的 mongodb 服务器启动副本集的 3 个副本节点&#xff08;mongodb 服务器&#xff09; 启动 mongodb 的客户端 MongoDB 下载MongoDB 安装1、解压…

App自动化测试笔记(一):搭建环境

一、三个环境 1、android模拟器&#xff1a;模拟安卓手机 2、androidSDK:android SDK给你提供开发测试所必须android API类库 3、java&#xff1a;android底层是c、c语言&#xff0c;应用层是java语言 二、java环境搭建 java安装 安装jdk-8u151-windows-x64.exe 配置环境变量…

JAVA的学习日记DAY1

JAVA的学习日记&#xff08;2024.3.1&#xff09;&#xff08;b站韩顺平老师课程学习笔记版&#xff09; ps:捡起忘光光的Java语言 Sublime //1. public是公有&#xff0c;class是类 //2. public class Hello表示Hello是一个类&#xff0c;是一个public公有的类 //3. Hello{…

【Redis | 第二篇】Redis的五种数据类型和相关命令

文章目录 2.Redis的数据类型和相关命令2.1常用数据类型2.2特性和用途2.2.1字符串&#xff08;String&#xff09;2.2.2哈希&#xff08;Hash&#xff09;2.2.3列表&#xff08;List&#xff09;2.2.4集合&#xff08;Set&#xff09;2.2.5有序集合&#xff08;Sorted Set&#…

SwiftUI中stroke属性的使用

在 SwiftUI 中&#xff0c;可以使用 stroke 属性来绘制形状的轮廓线。stroke 属性接受一个 Color 类型的参数&#xff0c;指定轮廓线的颜色。 以下是一个示例代码&#xff0c;演示如何在 SwiftUI 中使用 stroke 属性绘制矩形的轮廓线&#xff1a; import SwiftUIstruct Conte…

linux小记(1)

基本概念&#xff1a;不依靠扩展名来区分文件类型 好处&#xff1a;除了文本文件其他所有windows文件都无法在Linux下运行&#xff0c;包括病毒木马。 坏处&#xff1a;所有的软件都需要对linux单独开发 习惯用后缀来区分文件&#xff0c;方便管理。 -压缩包&#xff1a;*.…

第十二篇:学习python数据清洗

文章目录 一、啥是数据清洗二、将表格数据导入pandas中1. 准备工作2. 引入csv文件2.1 引入pandas库2.2 读取文件/修改名称3.2 快速浏览数据2.4 修改名字2.5 查找缺失值2.6 删除缺失值 3. 引入Excel文件3.1 引入pandas库3.2 读取Excel文件的人均GDP数据3.3 查看数据类型和non-nu…

YOLOv8从入门到入土使用教程!(一)训练模型

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文将演示如何使用YOLOv8进行训练及预测&#xff01; 二…

九型人格测试,2号人格助人型的职业分析

九型人格测试中的助人型&#xff0c;也叫二号人格&#xff0c;解读专业选择和职业选择。 助人型人格&#xff0c;在九型人格中&#xff0c;被视作一种给予者&#xff0c;他们总是喜欢帮助别人&#xff0c;有一个观念&#xff1a;“我不帮助别人&#xff0c;就没有人愿意喜欢我…

透明玻璃屏幕为什么那么贵

透明玻璃屏幕之所以价格较高&#xff0c;主要是由于以下几个方面的原因&#xff1a; 技术研发与创新&#xff1a;透明玻璃屏幕作为一种先进的显示技术&#xff0c;其研发和制造过程涉及到许多复杂的技术。这些技术的研发和创新需要投入大量的资金和时间。此外&#xff0c;透明玻…

无冬之夜:增强版 Neverwinter Nights Mac 激活版

Neverwinter Nights是一款角色扮演游戏。游戏的剧情发生在虚构的城市Neverwinter&#xff0c;玩家扮演一个冒险者&#xff0c;在这个城市中探索并完成各种任务。游戏中有许多不同的职业、种族、技能和法术可供玩家选择。游戏的主要特点包括多人游戏模式、自定义模块和工具包&am…

【书生·浦语大模型实战营】第5节 课后作业

LMDeploy 的量化和部署 0. 课程链接1. 课后作业1.1 基础作业1.2 进阶作业&#xff08;可选做&#xff09; 0. 课程链接 链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 1. 课后作业 1.1 基础作业 使用 LMDeploy 以本地对话、网页Gra…

HTML5:七天学会基础动画网页5

CSS3渐变 (可以给背景颜色设置一个渐变的效果) 线性渐变:Linear Gradients(从直线上向远处见面) 语法: background:linear-gradient(direction&#xff0c;color-stop1&#xff0c;color-stop2…)&#xff1b; direction:方向 to left, to right, 90deg 径向渐变:Radial …

Python Flask Web + PyQt 前后端分离的项目—学习成绩可视化分析系统

简介 使用工具&#xff1a; Python&#xff0c;PyQt &#xff0c;Flask &#xff0c;MySQL 注&#xff1a;制作重点在网页端&#xff0c;因此网页端的功能更全 WEB界面展示: 系统登录分为管理员&#xff0c;老师&#xff0c;学生3部分 管理员统一管理所有的账号信息以及登录…