【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化 (2)

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

图中的Device属性限制更严格,则选择Device类型;

Hypervisor如果想要改变默认整合行为,可以通过寄存器HCR_EL2(Hypervisor Configuration Register)来配置,比如设置Non-cacheable, Write-Back Cacheable等特性;

2.2.2 MMIO(Memory-Mapped Input/Output)

Guest OS认为的物理地址空间,实际是IPA地址空间,就像真实物理机中一样,IPA的地址空间,也分成内存地址空间和I/O地址空间:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

访问外设有两种情况:1)直通访问真实的外设;2)触发fault,Hypervisor通过软件来模拟;

VTTBR_EL2:Virtualization Translation Table Base Register,虚拟转换表基地址寄存器,存放Stage 2转换的页表;

为了模拟外设,Hypervisor需要知道访问的是哪个外设以及访问的寄存器,读访问还是写访问,访问长度是多少,使用哪些寄存器来传送数据等。Stage 2转换有一个专门的Hypervisor IPA Fault Address Register, EL2(HPFAR_EL2)寄存器,用于捕获Stage 2转换过程中的fault;

软件模拟外设的示例流程如下:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

1)虚拟机VM中的软件尝试访问串口设备;

2)访问时Stage 2转换被block住,并触发abort异常路由到EL2。异常处理程序查询ESR_EL2(Exception Syndrome Register)寄存器关于异常的信息,如访问长度、目标寄存器,Load/Store操作等,异常处理程序还会查询HPFAR_EL2寄存器,获取abort的IPA地址;

3)Hypervisor通过ESR_EL2和HPFAR_EL2里的相关信息对相关虚拟外围设备进行模拟,完成后通过ERET指令返回给vCPU,从发生异常的下一条指令继续运行;

2.2.3 SMMUs(System Memory Management Units)

访问内存的另外一种case就是DMA控制器。

非虚拟化下DMA控制器的工作情况如下:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

DMA控制器由内核的驱动程序来控制,能确保操作系统层面的内存的保护不会被破坏,用户程序无法通过DMA去访问被限制的区域;

虚拟化下DMA控制器,VM中的驱动直接与DMA控制器交互会出现什么问题呢?如下图:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

DMA控制器不受Stage 2转换的约束,会破坏VM的隔离性;

Guest OS以为的物理地址是IPA地址,而DMA看到的地址是真实的物理地址,两者的视角不一致,为了解决这个问题,需要捕获每次VM与DMA控制器的交互,并提供转换,当内存出现碎片化时,这个处理低效且容易引入问题;

SMMUs可以用于解决这个问题:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

SMMU也叫IOMMU,对IO部件提供MMU功能,虚拟化只是SMMU的一个应用;

Hypervisor可以负责对SMMU进行编程,以便让上层的控制器和虚拟机VM以同一个视角对待内存,同时也保持了隔离性;

2.3 Trapping and emulation of Instructions

Hypervisor也需要具备捕获(trap)和模拟指令的能力,比如当VM中的软件需要配置底层处理器来进行功耗管理或者缓存一致性操作时,为了不破坏隔离性,Hypervisor就需要捕获操作并进行模拟,以便不影响其他的VM。如果设置了捕获某个操作时,当该操作被执行时会向更高一级的Exception Level触发异常(比如Hypervisor为EL2),从而在相应的异常处理中完成模拟。

例子来了:

【原创】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

在ARM处理器中执行WFI(wait for interrupt)命令,可以让CPU处于一个低功耗的状态;

HCR_EL2(Hypervisor Control Register),当该寄存器的TWI==1时,vCPU执行WFI指令会触发EL2异常,从而Hypervisor可以对其进行模拟,将任务调度到另外一个vCPU即可;

捕获(traps)的另一个作用是可以用于向Guest OS呈现寄存器的虚拟值,如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfwzz.html