在本系列的第一部分中 ,我介绍了虚拟化的主题。 今天,我将更深入地探索用于内存管理和中断处理的ARM虚拟化扩展。 在核心内,虚拟化主要提供对系统寄存器的控制。 但是,随着我们远离核心并开始与外界进行交流,问题中的困难和细微差别开始浮现,并且对虚拟化的硬件支持的需求也日益明显。

需要注意的是,本文将介绍ARM体系结构的各个部分。 要更深入地了解实现细节,可以查阅《 ARM体系结构参考手册》。 这些可以在infocenter.arm.com上找到,但需要免费注册。

“虚拟”虚拟内存

虚拟化要求来宾OS无法访问系统管理程序的内存空间。 如果没有虚拟化扩展,则通过称为“影子页表”的技术来强制执行此要求。 在这种技术中,OS维护其页表,但是管理程序可防止OS正确设置内存管理单元 (MMU)寄存器。 相反,虚拟机管理程序将使用自己的映射创建自己的页表。 当发现页面错误时,它将读取由OS创建的页面表,将地址识别为由OS映射,并为硬件MMU使用的页面表创建实际的映射。 因此,只有管理程序才具有真正的虚拟地址 (VA)到物理地址 (PA)的转换,而不是来宾OS。 这种方法有两个问题:它不必要地使管理程序变得复杂,并且具有性能开销。

在ARM虚拟化扩展中,以上操作由硬件执行。 这简化了虚拟机管理程序,同时增加了功能并提高了性能。 在ARM虚拟化扩展中,虚拟机管理程序实质上将硬件设置为将来宾OS生成的“物理”地址视为虚拟地址,并在这些地址上添加另一级别的转换。 来宾OS地址的ARM术语是中间物理地址 (IPA)。 从IPA到PA的翻译称为第二阶段翻译,从VA到IPA的翻译称为第一阶段翻译。

图中显示了此转换的过程。禁用虚拟化时,仅执行阶段1转换。 第1阶段转换具有1到3个级别的表行(取决于页面大小,例如4KB页面需要3个级别,而1GB页面仅需要一个级别)。 第一级使用TTBR和VA为第一个描述符访问创建PA / IPA。 后续级别使用描述符和VA生成下一级描述符的地址,直到知道PA / IPA。 图中未阴影的框显示了此过程。



arm服务器虚拟化X86虚拟机 arm 虚拟化_python

ARM虚拟内存转换



启用虚拟化后,每个转换级别都有两个阶段。 第一阶段的工作如上所述,并输出IPA(中间物理地址)。 第2阶段采用IPA,并使用VTTBR为第2阶段tablewalk创建描述符地址(如下图所示)。 类似于第1阶段的人行道,第2阶段的人行道可以设置1到3级。



arm服务器虚拟化X86虚拟机 arm 虚拟化_linux_02

第二阶段翻译



那是很多描述符

由第二阶段的tablewalk增加的间接访问会很快变得非常昂贵。 内存访问已经是最昂贵的操作,通过虚拟化,我们可能需要多达16次访问才能获取所需的数据。 如果不进行虚拟化,则为减少页表遍历的成本,将转换结果保存在转换后备缓冲区(TLB)中。 使用虚拟化,台步的成本随着额外阶段的增加而大大增加。 在启用了虚拟化扩展的处理器中,不仅需要更大的TLB,而且还可以节省部分桌子步道,以加速桌子步伐。

你不可以过去

转换的第二阶段包括对虚拟机管理程序进行故障处理的权限控制。 这包括用于禁用来宾OS或在其上运行的应用程序对页表进行任何组合,读取,写入或执行的标准控件。

示例用例

无法进入

等待外部更新

仅路

懒惰的虚拟机副本

仅Wr

输出设备

所有途径

正常执行

所有内存都不相等

第二阶段还允许管理程序修改特定位置的内存属性,包括将其标记为设备内存。 请记住,ARM体系结构仅允许内存映射的I / O,因此可以通过页表映射完成I / O操作的隔离。 一般规则是,存储器的最终属性将对第一阶段和第二阶段的属性有更大的限制。 例如,如果第一阶段将内存标记为设备,第二阶段将其标记为可正常缓存,则处理器会将内存视为设备内存,即禁用缓存并强制执行对设备内存的排序要求。 当访客访问标记为设备内存的内存时,虚拟机管理程序还可以触发对虚拟机管理程序的陷阱。 系统管理程序可以使用此陷阱与物理外部硬件进行通信。

虚拟中断

处理设备属性是帮助来宾OS与外界通信的第一步。 下一部分是正确地指示中断。 ARM体系结构提供了多种处理中断的方法。 可以配置管理程序,以将所有中断重定向到管理程序。 系统管理程序还可以访问HCR中的位,以触发来宾OS中的虚拟中断。 在ARM体系结构中声明了中断时,设备会将中断引脚保持为高电平,直到OS告知设备降低中断引脚为止。 在运行操作系统时,必须保持此协议。 如果中断是由管理程序使用HCR触发的,则需要陷阱到管理程序以清除虚拟中断。

系统管理程序可以与通用中断控制器(Generic Interrupt Controller,GIC,发音为“ gick”)一起处理中断。 GIC被实现为内存映射的I / O设备,用于处理进入系统的所有中断的优先级和分配。 如果没有虚拟化,则操作系统会将中断的完成传达给GIC。 通过虚拟化,物理中断将重新路由到管理程序。 系统管理程序确定将中断重定向到的正确VM,并为GIC设置相应的虚拟接口。 它还为来宾OS设置第二阶段页表,以映射到GIC的虚拟CPU接口。 从那时起,GIC将知道如何重新路由该中断,并且不需要管理程序干预。

内存管理和中断虚拟化都从根本上解决了将虚拟机沙箱化以及为来宾OS提供对物理设备的访问所涉及的问题。 下周,我们将讨论系统扩展以支持虚拟化。

资源资源

参考:未来芯片》博客上的JCG合作伙伴 Aater Suleman的 ARM虚拟化扩展-内存和中断》(第2部分)

翻译自: https://www.javacodegeeks.com/2013/03/arm-virtualization-extensions-memory-and-interrupts-part-2.html