Armv8-A虚拟化手册(6)

9 Nested虚拟化

        理论上,hypervisor可以运行在虚拟机上。这个概念可称为Nested虚拟化。

        我们把第一个hypervisor称为host hypervisor,在虚拟机中的hypervisor称为guest hypervisor。

        在Armv8.3-A之前,通过将guest hypervisor运行在EL0可将guest hypervisor运行在虚拟机上,这需要明显大量的软件模拟,既难以实现又可能导致性能差。随着本特性在Armv8.3-A的增加,可以将guest hypervisor运行在EL1。随着本特性在Armv8.4-A,过程更有效率,虽然它仍涉及在host hypervisor额外的操作。

9.1 guest hypervisor访问虚拟化控制

        我们不希望让guest hypervisor直接访问虚拟化控制。这是因为直接访问可能允许虚拟机破坏基础服务,或发现host平台的信息。潜在的问题与之前模拟和trap中列举的例子类似。

        运行在EL1的guest hypervisor。HCR_EL2中新的控制允许host hypervisor来跟踪guest hypervisor来访问虚拟化控制。

  1. HCR_EL2.NV:使能硬件支持Nested虚拟化
  2. HCR_EL2.NV1:使能额外的一组trap
  3. HCR_EL2.NV2:使能重定向到内存
  4. VNCR_EL2:当NV2=1时,指向内存中的结构体

        Armv8.3-A增加了NV和NV1控制,从EL1访问EL2寄存器通常没有定义,访问将造成对EL1的异常。NV和NV1位会造成EL1通过trap EL2来访问EL2寄存器。这允许guest hypervisor运行在EL1。EL2上的host hypervisor模拟它的一些操作。NV也从EL1 trap ERET。

        下图显示guest hypervisor的建立和进入虚拟化:

  1. guest hypervisor访问EL2寄存器是通过trap到EL2。Host hypervisor记录了guest hypervisor建立的配置
  2. Guest hypervisor尝试进入guest虚拟机(guest的guest虚拟机),并ERET trap到EL2
  3. hypervisor取加guest的guest配置,并将它加载到合适的寄存器。然后host hypervisor将清NV位并进入guest的guest。

        这个方法的问题是通过guest hypervisor的每次访问EL2寄存器必须被trap。当任务切换在两个vCPU或虚拟机时,很多寄存器都可以访问,这会导致很多trap。每次trap会导致过度的异常和返回。

        一个更好的解决方法是捕捉EL2寄存器的配置,仅对host hypervisor的ERET时trap。当NV2被设置时,Armv8.4-A可以使用该方案,EL1访问EL2寄存器被重定向到内存中的结构体。Guest hypervisor可以读和写寄存器很多次,而仅仅只需要一次trap。ERET仍trap到EL2,在这个时候host hypervisor可以从内存中重取配置。

        下图描述这个概念:

  1. 从EL1的guest hypervisor访问EL2寄存器被重定向到内存中的结构体。结构体的位置由host hypervisor中VNCR_EL2指定;
  2. Guest hypervisor尝试进入它的guest虚拟机(guest的guest虚拟机),ERET trap到EL2;
  3. Host hypervisor取回guest的guest的配置,并将其加载到合适的寄存器中。Host hypervisor清NV位并进入guest的guest中。

这个方法的优点是更少的trap,因此更少的访问host hypervisor。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值