《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(5)

13.2 ATS(Address Translation Services)

单纯使用IOMMU并不能充分发挥处理器系统的效率,从图13-2中可以发现,

所有的PCI设备在进行DMA操作时,需要经过TA和ATPT进行地址翻译,然后才能访问主存储器。因而TA和ATPT很容易成为瓶颈,从而影响虚拟化系统的整体效率

除此之外,在图13-2中,EP1和EP2分别隶属于Domain1和Domain2。在正常情况下,一个Domain并不能访问其它Domain的PCI设备。但是如果处理器系统中存在一个恶意的虚拟机,而且EP1隶属于该虚拟机(Domain1)。当EP1进行DMA写操作时,该虚拟机填写的DMA写地址可以与EP2的BAR地址空间重合,那么启动DMA写操作时,Domain1可以将数据传递到EP2,从而影响Domain2的正常运行。

解决这种异常最合理的方法是,隶属于Domain1的PCI设备只能访问GPA1的空间,而仅使用IOMMU并不能解决该问题。解决该问题较为有效的方法是PCI设备进行数据传送的同时也进行地址转换,从而使该PCI设备使用的地址是经过转换的HPA地址此时再进行DMA写时,该数据将传递到与Domain1对应的HPA是地址空间中,而不会将数据传送到EP2。这样,这个恶意的虚拟机并不会影响其它正常工作的虚拟机。

PCIe总线使用ATS(Address Translation Services)机制实现PCIe设备的地址转换。支持ATS机制的PCIe设备,内部含有ATC(Address Translation Cache),ATC在PCIe设备中的位置如图13-8所示:

在ATC中存放ATPT的部分内容,当PCIe设备使用地址路由方式发送TLP时,其地址首先通过ATC转换为HPA地址。如果PCIe设备使用的地址没有在ATC中命中时,PCIe设备将通过存储器读取TLP从ATPT中获得相应的地址转换信息,更新ATC后,再发送TLP

与其它Cache类似,ATC还可以被Invalidate。当ATPT被更改时,处理器系统将发送Invalidate报文,同步在不同PCIe中的ATC。

PCIe总线在TLP中设置了AT字段以支持ATS机制在PCIe总线中,只有与存储器相关的TLP支持AT字段。值得注意的是,只有处理器系统支持IOMMU时,PCIe设备才可以使用ATS机制

13.2.1 TLP的AT字段

TLP的AT字段与ATS机制直接相关。根据AT字段的不同,PCIe设备可以发送三种类型的TLP

1. AT字段为0b00

当AT字段为0b00时,当前TLP的Address字段没有通过ATC进行转换,存放的是PCI总线域的物理地址

如果PCIe设备不支持ATS机制,而且处理器系统也没有使能IOMMU时,当前TLP的Address字段为PCI总线域的物理地址。PCIe设备进行DMA操作时,该地址被RC转换为存储器域的物理地址,然后对存储器进行读写操作;

如果PCIe设备不支持ATS机制,但是当前处理器支持IOMMU时,当前TLP的Address字段依然为PCI总线域的物理地址。PCIe设备进行DMA操作时,该地址将被TA根据I/O页表的设置,转换为合适的存储器域物理地址

如果当前处理器系统支持虚拟化技术,当前PCIe设备将隶属于某一个Domain,此时该PCIe设备进行DMA操作时,数据将被传送到属于该Domain的存储器域中。

2. AT字段为0b01

当AT字段为0b01时,表示当前TLP报文为“Translation Request”报文支持ATS机制的PCIe设备,必须支持这类报文

该报文由PCIe设备通过存储器读请求TLP发出,其目的地为TA。TA收到报文后,将根据I/O页表的设置,将合适的地址转换关系,通过存储器读完成TLP,发送给PCIe设备。而PCIe设备收到此地址转换关系后,将更新ATC。

3. AT字段为0b10

当AT字段为0b10时,表示当前TLP的Address字段已经通过ATC进行地址转换。当PCIe设备使用存储器读写报文进行DMA操作,而RC收到这些报文时,将不再通过TA和ATPT进行地址转换,而直接将数据发送给存储器。从而减轻了ATPT进行地址转换的压力。

值得注意的是,经过ATC进行地址转换后,在TLP的Address字段中存放的依然是PCI总线域的物理地址,该物理地址为HPA地址在PCI总线域中的映像

如果TLP中的Address字段没有经过ATC进行地址转换,并且处理器系统支持虚拟化技术,该地址为仍然对应GPA地址在PCI总线域中的映像。此时该TLP使用的AT字段为0b00。这些地址在经过RC后,将被转换为存储器域的地址,然后进入TA和ATPT再次进行地址转换。由以上描述可以发现,PCIe设备无论是否使用ATC机制,在TLP中存放的Address字段仍然保存的是PCI总线域地址

更多内容请看下回。

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

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

相关文章

TIM编码器接口(编码器测速)

定时器编码器接口自动计次--------->对应手册14.3.12编码器接口模式 应用场景: 电机控制PWM驱动电机,编码器测电机速度,PID算法闭环控制 ------------------------------------------------------------------------------------------…

C++入门学习(三十)一维数组的三种定义方式

数组是什么? 数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素…

Nuxt3+Vue3(Composition API)+TS+Vite+Ant Design Vue 搭建

最近官网搭建选择了nuxtjs,由于框架更新了,其中语法也有很多变化,中间遇到了一些问题点做下总结。 nuxt3官方文档地址:https://nuxt.com/docs/getting-started/installation 安装 在安装Nuxt3之前,你需要保证你的nod…

第四次作业:XTuner InternLM-Chat 个人小助手认知微调实践

参考文档: https://github.com/InternLM/tutorial/blob/main/xtuner/README.md https://github.com/InternLM/tutorial/blob/main/xtuner/self.md 数据准备: 配置文件: # Copyright (c) OpenMMLab. All rights reserved. import torch fr…

安装 SEED-XDS560v2 Driver.exe

安装 SEED-XDS560v2 Driver.exe References CCS 5.5.0.00077 安装目录 D:\ti\ccsv5\ SEED-XDS560v2 Driver.exe 安装目录 D:\ti\ccsv5\ccs_base References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

双机调试-vm

双机调试 环境配置基础操作内存操作读内存写内存内核(双机调试)读内存搜索内存读内存显示为汇编指令读写寄存器和标志位杂项断点 环境配置 虚拟机端 打开cmd bcdedit /copy {current} /d Debug bcdedit /timeout 30输入以上结果重启后进入debug系统 M…

单测的思路

文章目录 单测的定义方法的单测几种生成工具的对比生成步骤 接口的单测场景的单测总结参考 单测的定义 单元测试(Unit Testing)是一种软件开发中的测试方法,它的主要目的是确保软件中的最小可测试单元(通常是函数、方法或类&…

【无标题】管理kvm 虚拟机

管理kvm 虚拟机 点击虚拟机 创建新的虚拟机 安装操作系统 设置root密码

[VulnHub靶机渗透] Fowsniff

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

【Linux系统化学习】缓冲区

目录 缓冲区 一个样例 现象解释 缓冲区存在的位置 缓冲区 在刚开始学习C语言的时候我们就听过缓冲区这个名词,很是晦涩难懂;在Linux下进程退出时也包含缓冲区,因此缓冲区到底是什么?有什么作用? 让我们先从一个小…

项目架构梳理

单点登录组件 CREATE TABLE user_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键,用户id,username varchar(30) NOT NULL COMMENT 用户姓名,password varchar(60) NOT NULL COMMENT 密码,token varchar(60) DEFAULT NULL COMMENT token,token_expire datetime DEF…

redis高级篇

为什么用单线程 开始多线程和io复用 linux连接redis其实就是一个socket过程 bigkey记录案例和生产故障 插入100w数据 不使用key*那使用什么?:scan bigkey发现删除优化策略

代码随想录day21--回溯基础

理论基础 回溯法也可以叫回溯搜索法,它是一种搜索的方式。我们在二叉树中也多次提到了回溯。回溯是递归的副产品,只要使用了递归就会有回溯,我们我们就可以笼统的将回溯函数称为递归函数 回溯法解决的问题 1.组合问题:N个数里面…

非线性一元方程求解——弦截法、牛顿迭代法(C++)

一元方程 对于一元方程,如果要求f(x)0的解,其过程大致包括如下三个问题: 根的存在性:是否有根,如果有,有几个?根的分布:根分布区间;求根的公式:如何从根的近…

成本效能FinOps: Crane 部署

目录 一、实验 1.环境 2.安装kind 3.安装Crane 二、问题 1.脚本安装prometheus报错 2.查看集群信息失败 3.Helm添加grafana 报错 4.查看crane资源失败 5.prometheus部署时kube-state-metrics 拉取镜像显示ImagePullBackOff 6.Crane 功能与架构 一、实验 1.环境 &a…

记录 | 验证pytorch-cuda是否安装成功

检测程序如下: import torchprint(torch.__version__) print(torch.cuda.is_available()) 或者用终端 Shell,运行情况如下

单片机移植Lua(STM32H743移植Lua-5.4.6)

文章目录 目的移植演示示例链接更多说明合理设置内存大小按需加载标准库实现系统和IO接口设置引用路径 总结 目的 通常单片机都是使用C/C来开发的,任何修改都需要重新编译固件然后下载运行。在一些需要灵活性更强的场合中可以内嵌Lua解释器实现动态更新应用程序的功…

【Linux】管道文件 打包压缩 文本编辑器nano 进度条

目录 什么是管道文件? 打包和压缩 文本编辑器 nano的安装 nano的使用 退出nano编辑,ctrlx 普通用户无法sudo,该怎么解决 Linux小程序-进度条 预备知识 1.回车换行 2.缓冲区 准备工作 代码实现 1.processBar.h代码编写 2.main.c代…

@ControllerAdvice 的介绍及三种用法

ControllerAdvice 的介绍及三种用法 浅析ControllerAdvice 首先,ControllerAdvice本质上是一个Component,因此也会被当成组建扫描,一视同仁,扫扫扫。 然后,我们来看一下此类的注释: 这个类是为那些声明了&…

订餐|网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)

网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 (1)用户注册界面 (2)用户登录界面 (3)菜品详情界面 &#xff08…