首页 > 其他分享 >Armv8-A 虚拟化学习

Armv8-A 虚拟化学习

时间:2023-07-23 16:11:50浏览次数:48  
标签:虚拟化 中断 hypervisor VM 学习 虚拟 Armv8 外设

Armv8-A 虚拟化

参考文献:Armv8-A virtualization.pdf

Arm中,常使用的虚拟机监视器有Xen(type1)和KVM(type2)。

  • 全虚拟化和半虚拟化

全虚拟化是指一般的虚拟机,它可以完全模拟物理机器。但性能差,每次对寄存器的操作都得经过监视器。

半虚拟化是为了提升性能的,如Guest OS,它好像运行在一个虚拟硬件平台上。

  • 虚拟机和虚拟CPU
image-20230526220803491
  • AArch64下的虚拟化
image-20230526221114538

Stage 2 translation

Stage 2 translation允许监视器控制VM的内存视图。可确保一个VM只能看到分配给它的资源。

image-20230526221849651

客户机OS控制着Stage 1 Tables,自认为控制了物理地址空间。然而,还有第二个阶段的地址转换,这是由监视器控制。

每个VM都有一个虚拟机标识符VMID,这样在TLB里可以通过VMID来区分不同的VM对应的表项。

同时,TLB表项中还会有一个ASID标识符(Address Space Identifier),它标识不同的应用,防止不同应用相互干扰。每个VM有自己独立的ASID命名空间。即使ASID相同,但VM不同,它们也不会互相影响。

  • 属性合并和覆盖

阶段1和阶段2的映射都包含一些属性,比如类型和权限。MMU会合并这两个映射的属性,得到最终的属性值。MMU使用两个阶段里最严格的属性。

模拟内存映射IO

一个VM的IPA空间包含内存和外设区域。VM的外设可以是虚拟外设,也可以是真实外设(直通设备)。

  • 真实外设

如果是直通设备,也就是一个真实的物理设备真的分配给了VM,并直接映射到了IPA地址空间。因此VM可以直接访问外设。

  • 虚拟外设

虚拟外设是指hypervisor模拟出来的外设。当VM访问外设对应IPA地址空间的位置时,会产生abort,之后交由hypervisor完成访问,之后异常返回。

系统MMU(SMMU)

对于其他IO方式,例如DMA,它有一个DMA控制器。对于VM来讲,系统结构图是这样的:

image-20230714172003866

如果让监视器来实现DMA的两阶段映射的话,会带来额外的性能开销。解决办法就是IOMMU,又叫做SMMU。这样DMA看到的内存,与VM(OS级)看到的物理内存,是一样的了。

image-20230714172817867

通过trap模拟特定指令的执行

如果客户机想要执行一些特权指令,那么监视器应该能捕获到这种指令,并来模拟该指令去修改,这样可以保证安全性。

例如执行Wait For Interrupt(WFI)指令可以让CPU处于低功耗状态。当EL0或EL1时执行WFI,发生trap交由hypervisor来处理。

注意,客户机的程序执行流也是在真实CPU上跑的,不同EL级的差别在这些CPU寄存器的配置位不同

image-20230723144908832

当客户机想读取一个寄存器,而Hypervisor想呈现一个不同的值,叫做虚拟值。这时就可以发生trap到EL2级,hypervisor返回时呈现一个自定义的值给客户机。

异常的虚拟化

使用虚拟化的系统,一些中断可能被hypervisor自己来处理,一些可能由VM的软件来处理。为了避免出现VM此时没有被调度但针对该VM的中断发生的情况,ARM采用了两个机制:

  1. 一些中断支持在EL2级被hypervisor解决
  2. 其他中断能交给对应的VM或vCPU

为了实现这2种机制,ARM包含了对虚拟中断的支持:vIRQ和vFIQ。这两种中断只能在当执行El0和El1发生。

VM通常只会接受虚拟中断,而不是真实中断。

  • 允许虚拟中断

设置HCR_EL2.IMO位,即可开启vIRQ等虚拟中断

  • 产生虚拟中断

有2种机制可以用来产生虚拟中断。

a. 通过设定HCR_EL2寄存器的3个特定位VI、VF、VSE来产生一个对vCPU的中断信号。这样由hypervisor来模拟产生中断,会带来额外运行开销。

b. 使用GIC产生虚拟中断。GIC通过两套相同的接口来产生真实和虚拟中断。hypervisor可以将虚拟CPU接口映射到VM,实现VM和GIC的直接通信,从而不需要hypervisor来模拟中断

image-20230723153311449
  • 一个例子

假设使用GIC来产生虚拟中断。一台物理外设连接GIC,当物理外设发出中断信号时,交由GIC处理,之后的步骤如下图所示:

image-20230723155429630

标签:虚拟化,中断,hypervisor,VM,学习,虚拟,Armv8,外设
From: https://www.cnblogs.com/fyqs/p/17575143.html

相关文章

  • salesforce零基础学习(一百二十九)Lead Convertion 有趣的经历
    本篇参考:https://help.salesforce.com/s/articleView?id=000382564&type=1LeadConvertion是salesforce中salescloud的一个很好用的功能。salescloud流程可以简单的理解成leadtocash。当对lead进行打分以及不断的孵化以后,优质lead会转成Account&Contact&Opportunity。......
  • python+playwright 学习-68 事件监听console 内容
    前言playwright可以通过page.on()监听console内容console事件当我们打开百度页面,f12打开控制台,会看到console输出的内容playwright可以通过page.on()监听console,获取到console的内容page.on()监听示例代码fromplaywright.sync_apiimportsync_playwright"......
  • 在尚硅谷学习docker 笔记
    尚硅谷docker学习笔记1.docker简介(基础篇)2.docker的安装3.docker的常用命令3.1帮助启动类命令3.2镜像命令3.3容器命令4.对docker镜像的深入理解4.1镜像的一些重要概念4.2docker镜像commit操作案例4.3本地镜像发布到阿里云/私有库5.docker容器数据卷(实现持久......
  • 1.1.1 深度学习介绍
     1.深度学习a.机器学习的分支,人工神经网络为基础,对数据的特征进行学习的算法2.机器学习和深度学习的区别a.特征抽取:i. 机器学习:人工的特征抽取ii. 深度学习:自动的进行特征抽取b. 数据量i. 机器学习:数据少,效果不是特别好......
  • 构造、交互题技巧学习小记
    (本文仅包含技巧和例题,无题目解析)抽屉原理抽屉原理通常的表述时,将\(n\)个物品放入\(k\)个抽屉,则其中必有一个抽屉包含至少\(\lceil\fracnk\rceil\)个物品也一定有一个抽屉包含至多\(\lfloor\fracnk\rfloor\)个物品。在一些构造题中,经常会要求构造一个权值至多(少)为某个......
  • 学习设计模式,修炼内功。
    常用设计模式之.Net示例代码合集 每一次初学者粉丝朋友,在后台向我咨询编程问题,我除了给他们指导学习路线,我都会建议他们学完基础知识后,一定要要注重编程规范,学习设计模式,修炼内功。虽然说很多程序员,他们日常主要工作是CRUD,但是学习设计模式也是有助于学习公司的框架,另外设计......
  • python+playwright 学习-67 抓取 table 表格数据
    前言最近有小伙伴提到如何抓取table表格上的数据,table表格的数据很简单,就是行和列。可以按行抓取,也可以按列抓取。获取table某一列的数据抓取第3列(项目名称)所有数据定位方式$x('//table/tbody/tr/td[3]')于是可以看到当前页面的第3列数据被全部定位到接下来就可以......
  • vue 学习第1天
    vue的特点:1.采用组件化模式,提高代码复用率,且让代码更好维护,一个模块可以封装组件2.声明式编码,提高开发效率,心有林夕,标签+for循环,而不是一步步去写3.虚拟dom,相当于后端的缓存 脚手架的文件的格式1:vue-cli脚手架初始化项目2:node+webpack+淘宝镜像node_modules......
  • 网络流学习笔记
    1.一些基本定义网络网络是指一个有向图\(G=(V,E)\)。每条边\((u,v)\inE\)都有一个权值\(c(u,v)\),称之为容量(Capacity),当\((u,v)\notinE\)时有\(c(u,v)=0\)。其中有两个特殊的点:源点(Source)\(s\inV\)和汇点(Sink)\(t\inV,(s\neqt)\)。流设\(f(u,v)\)定义在二元组......
  • [C#基础学习]一些自带的常用数据结构
    System.Collections.ArrayList一个能储存任何数据类型的list,可用函数:​ Add:添加一个内容。​ AddRange:批量增加,将另一个ArrayList添加到末尾。​ Insert:在特定位置插入一个值。​ Remove:正序遍历删除第一个对应值。​ RemoveAt:删除数组位置对应元素。​ Clear:清空ArrayLis......