ARMv8-A 可选择支持虚拟化。GICv3也支持虚拟化。GICv3对虚拟化的支持包括:

(1)CPU接口寄存器的硬件虚拟化;

(2)虚拟化中断;

(3)维护中断;

NOTE: GIC架构不提供虚拟化Distributor,Redistributor和ITS。这些接口的虚拟化必须由软件处理。这不在本文档中描述。

1. 术语

        Hypervisor创建,控制和调度虚拟机VM。一个虚拟机在功能上等于一个物理系统,包含一个和多个虚拟处理器。这些虚拟处理器包含一个或多个虚拟PE(vPE)。

        本章讨论的大多数控制工作在vPE级别。

2. 接口

        CPU接口寄存器可分为三组:

(1)物理CPU接口寄存器

(2)虚拟控制寄存器

(3)虚拟CPU接口寄存器

2.1 物理CPU接口(ICC_*_ELn)

        执行在EL2的hypervisor软件使用ICC_*_ELn来处理物理中断。

2.2 虚拟控制(ICH_*_EL2)

        hypervisor访问寄存器来控制架构提供的虚拟化特性。这些特性包括:

(1)使能和禁用虚拟CPU接口;

(2)访问虚拟寄存器状态来使能上下文切换;

(3)配置维护寄存器;

(4)控制虚拟中断;

        这些寄存器控制需要访问的物理PE的虚拟化特性。它不能访问其他PE的状态。PE X上的软件不能访问PE Y。

2.3 虚拟CPU接口(ICV_*_ELn)

        执行在虚拟化环境的软件使用ICV_*_ELn寄存器来处理中断。这些寄存器与ICC_*_EL1寄存器有相同的格式和功能。

        ICV和ICC寄存器有相同指令编码。在EL2,EL3和安全EL1,ICC通常一直能被访问。在非安全EL1,是否ICC或ICV寄存器能够被访问是由HCR_EL2中routing bit决定。

        ICV寄存器可分为三组:

(1)Group 0

        寄存器如ICC_IAR0_EL1/ICC_IAR0_EL1用于处理Group 0中断。当HCR_EL2.FMO=1时,在非安全EL1可访问ICV寄存器而不是ICC寄存器。

(2)Group 1

        寄存器如ICC_IAR1_EL1/ICC_IAR1_EL1用于处理Group 1中断。当HCR_EL2.FMO=1时,在非安全EL1可访问ICV寄存器而不是ICC寄存器。

(3)通用

        寄存器如ICC_DIR_EL1/ICV_DIR_EL1和ICC_PMR_EL1/ICV_PMR_EL1用于处理Group 0和Group 1中断。当HCR_EL2.IMO=1或HCR_EL2.FMO=1时,在非安全EL1可访问ICV寄存器而不是ICC寄存器。

        下图显示了在HCR_EL2路由控制的基础上同样的指令是如何访问ICC或ICV寄存器的。

3. 虚拟中断的管理

        执行在EL2的hypervisor可以通过LR寄存器ICH_LRn_EL2产生虚拟中断。每个寄存器代表着一个虚拟中断,并记录:

(1)vINTID

        在虚拟环境下报告INTID。

(2)状态

        虚拟中断状态有pending, active, ative and Pending 以及inactive。由于虚拟环境下的软件与GIC交互,状态机自动更新。比如,hypervisor创建一个新的中断,并初始化设置状态位pending。当在vPE的软件读ICV_IARn_EL1,状态更新到active。

(3)Group

        虚拟环境通常表现为GICD_CTLR.DS=1。因此虚拟中断可以为Group 0和Group 1。Group 0中断以vFIQ发送,Group 1中断以vIRQ发送。

(4)pINTID

        虚拟中断可选择性的被物理中断INTID标识。当vINTID的虚拟机更新时,因此为pINTID。

3.1 物理中断发送给vPE的例子

        下图显示了物理中断被发送到vPE的时序:

(1)物理非安全Group1中断从Redistributor发送到物理CPU接口;

(2) 物理CPU接口检查是否物理中断直接发送到一个PE。过程之前已经描述。在本例子中,检查通过并产生物理异常;

(3)中断被进入EL2。hypervisor读取IAR,并返回pINTID。这时pINTID进入active状态。hypervisor决定中断被直接发送到当前运行的vPE。hypervisor写pINTID到ICC_EIOR1_EL1。当ICC_CTLR_EL1.EOImode=1时,仅降低优先级不需要deactivate物理中断;

(4)hypervisor写LR寄存器来注册一个pending的虚拟寄存器。LR寄存器条目指明了要发送的vINTID和原始的pINTID。hypervisor发出异常返回,将异常返回给vPE;

(5)vCPU接口检查是否将虚拟中断直接发送给vPE。这些检查与物理中断一样,而不是使用ICV寄存器。在本例子中检查通过并发起虚拟异常;

(6)虚拟异常进入非安全EL1。当软件读取IAR时,vINTID返回且虚拟中断进入active状态;

(7)Guest OS处理中断。当它完成处理中断,写EOIR寄存器发出优先级降低和deactivation。因为LR寄存器记录在pINTID,它会未激活vINTID和pINTID。

4. 维护中断

        若在虚拟CPU接口中某些条件为true时,CPU接口可以配置来产生物理中断。

        这些中断以PPI中断报告,INTID25。这个中断通常被配置为非安全Group 1,且在EL2被hypervisor 软件处理。

        维护中断的产生由ICH_HCR_EL2控制,当前发送的中断由ICH_MISR_EL2上报。

        若vPE清除在vCPU接口中的Group enable bit的一位时,维护中断产生。hypervisor可以移除任何LR寄存器来pending虚拟中断(属于disabled group)。

5. 传统虚拟机

        使用GICv3系统寄存器(ICC_SRE_EL2.SSRE=1)的hypbervisor可以控制使用传统行为(ICC_SRE_EL1(NS)=0)的VM。在这种情况下在虚拟环境下执行的软件可以使用映射到GICV寄存器的内存,如GICv2。

6. 上下文切换

        当在vPE之间进行上下文切换,hypervisor软件清除一个vPE的状态并加载了另一个的上下文。虚拟CPU接口的状态形成了一个vPE的部分上下文。虚拟CPU接口状态包含:

(1)ICV寄存器的状态

(2)有效虚拟化优先级

(3)任意pending, active或active and pending虚拟中断

        使用ICH寄存器可以从EL2访问ICV寄存器的状态。如例子中显示了ICH_VMCR_EL2中的域映射到ICV寄存器状态。

        当在切换vPE时,有效的虚拟属性必须要保存和重导出。可通过ICV_APnR_EL2寄存器访问当前vPE的有效属性。

        在章节3中描述,通过LR寄存器管理虚拟中断。这些寄存器的状态只针对当前vPE。因此这些寄存器必须在上下文切换时要保存和重导出 。

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐