Armv8-A虚拟化手册(3)
作者:互联网
6. 虚拟化异常
在系统中中断被硬件用于发送事件给软件。比如,GPU可能发送中断通知它完成了渲染帧。
使用虚拟化的系统更复杂。一些中断可能由hypervisor自己处理。其他中断可能来自分配了虚拟机的设备,并且需要由虚拟机中的软件来处理。中断目标的虚拟机也可能在中断被接受时没有运行。
这意味着你需要机制来支持hypervisor来处理EL2中的一些中断的处理。同时也需要机制在虚拟机中将一些中断发给某些虚拟机或某些VCPU。
为了使能这些机制,架构支持一些虚拟中断:vIRQ, vFIQ和vSErrors。这些虚拟中断行为像物理中断(IRQ, FIQ和SErrors),但仅执行在EL0和EL1被发起。在执行在EL2或EL3时不能接受虚拟中断。
NOTE: 总结来説,安全状态的虚拟化支持在Armv8.4-A被引入。对于在安全EL0/1发起的虚拟中断,安全EL2需要被支持和使能。否则在安全状态的虚拟中断不会被发起。
6.1 使能虚拟中断
为发起虚拟中断到EL0/1,hypervisor必须设置HCR_EL2中的相关位。比如,为使能vIRQ发送,hypervisor必须设置HCR_EL2.IMO。这个设置路由物理IRQ异常到EL2,并使能虚拟异常的发起到EL1。
根据每种中断类型控制虚拟中断。在理论上,虚拟机可以配置为接受物理FIQ和虚拟IRQ。特别是这并不常见。虚拟机通常被配置为只接受虚拟中断。
6.2 产生虚拟中断
这里有两种机制产生虚拟中断:
- 在core内部,在HCR_EL2进行控制;
- 使用GICv2或后续版本的中断控制器;
首先我们看机制1。在HCR_EL2中有三个位来控制虚拟中断的产生:
- VI = 设置此位注册一个vIRQ;
- VF= 设置此位注册一个vFIQ;
- VSE= 设置此位注册一个vSError;
设置这些位中的一个等于中断控制器发起一个中断信号给vCPU。产生的虚拟中断受PSTATE屏影响,像正常的中断一样。
这个机制使用很简单,但缺点是它仅提供一种方法来产生。然后hypervisor被要求模拟在虚拟机中中断控制器的操作。总结来説,在软件中陷入和模拟操作可能涉及过度,这最好避免过度操作如中断。
第二个选择是使用GIC来产生虚拟中断。从ARM GICv2,GIC可以通过提供物理CPU接口和虚拟CPU接口发起物理和虚拟中断,如下图所示:
这两个接口相同,除了一个发起物理中断,另一个发起虚拟中断。hypervisor可以映射虚拟CPU接口到一个虚拟机中,允许虚拟机中的软件来直接与GIC通信。这个方法的优点为hypervisor仅需要建立虚拟接口,并且不需要模拟。这个方法减少异常被陷入到EL2的次数,并且因此减少虚拟中断的过度。
NOTE: 虽然ARM GICv2可能被用来Armv8-A设计,GICv3和GICv4通常被使用。
6.3 发起中断到vCPU的例子
到目前为止,我们看到了虚拟中断是如何使能和产生的。让我们看一个发起虚拟中断到vCPU的例子。在这个例子中,我们将考虑一个物理外设被赋予给虚拟机,如下图所示:
这个图呈现如下步骤:
- 物理外设发起中断信号到GIC;
- GIC产生一个物理中断异常,或IRQ或FIQ,通过HCR_EL2.IMO/FMO来路由中断到EL2。hypervisor区分外设并决定它是否被赋予到虚拟机。它判断中断被发送给哪个vCPU。
- hypervisor配置GIC来发起物理中断作为虚拟中断给vCPU。GIC将发起vIRQ或vFIQ信号,但在EL2时处理器将忽略这个信号;
- hypervisor将控制返回给vCPU;
- 现在处理器在EL0或EL1,来自GIC的虚拟中断可以被处理。虚拟中断受PSTATE异常屏所限。
例子展现了一个物理中断以虚拟中断被发送。例子符合stage2转换中描述的外设模型。对于虚拟中断,hypervisor可以创建一个虚拟中断,而不需要将其与物理中断关联。
6.4 中断屏蔽和虚拟中断
在异常模型中,我们引入在PSTATE中引入中断屏蔽位,PSTATE.I对应IRQ,PSTATE.F对应FIQ,PSTATE.A对应SErrors。当运行在虚拟环境中,这些屏蔽稍微有些不同方式。
比如,对于IRQ,我们已经看到设置HCR_EL2.IMO做两件事情:
- 路由物理IRQ到EL2;
- 在EL0和EL1使能发起vIRQ;
这个设置也修改PSTATE.I屏蔽在应用。在EL0和EL1,如果HCR_EL2.IMO=1,PSTATE.I运行在vIRQ而不是pIRQ。
标签:发起,虚拟化,中断,hypervisor,虚拟机,手册,虚拟,EL2,Armv8 来源: https://blog.csdn.net/flyingnosky/article/details/122631150