ARMv7 KVM 在 linux中的实现 2 cpu角度

实现CPU的虚拟化的要求
	1.KVM/ARM必须向虚拟机提供一个接口,该接口本质上与底层的实际硬件CPU相同
	2.同时确保hypervisor具有硬件的控制权。

对 "实现CPU的虚拟化的要求"的分析
	1. 需要确保在虚拟机中运行的软件必须具有访问实际物理CPU上寄存器状态的能力,以及确保hypervisor及其主机内核相关联的物理硬件状态在运行的虚拟机中是持久的。
	2.不影响虚拟机的寄存器状态.可通过保存虚拟机状态并在从虚拟机切换到主机时从内存中恢复主机状态来完成上下文的切换,反之亦然。
		虚拟机会直接访问硬件。(虚拟机在未陷入到hypversor的情况下可直接对一级页表基寄存器进行编程,这是多数guest操作系统中相当常见的操作。)
		如果虚拟机访问了硬件,从而影响了 hypervisor 或 泄露了 虚拟机的信息,这就不合适了
  • ARM 对虚拟化的扩展 :TrustZone模式和HYP模式
ARM架构不是天生是一个可虚拟化的经典架构,所以只能用扩展来做
ARM在最新的ARMv7和ARMv8体系架构中引入了可支持虚拟化的扩展选项。 // Cortex-A15就是支持硬件虚拟化的ARMv7的CPU。
新增了 TrustZone模式和HYP模式 以支持 虚拟化 // 注意 hyp 要依赖于 TrustZone 模式
  • TrustZone模式 下的虚拟化方案探讨
在 安全态还是非安全态 做 虚拟化

安全态
	通过在安全态下运行虚拟机监控程序TrustZone可能对虚拟化很有用
	因为其不支持trap和模拟.并不存在将非安全态中执行的操作trap到安全安全态的方法。
非安全态
	可以自由配置,例如虚拟内存。
	任何运行在最高非安全态的软件都可以访问所有非安全物理内存,从而不可能隔离在非安全环境中运行的多个虚拟机。

其他
	ARM架构的CPU总是在安全态启动,
	安全态只用于特定的用例,例如数字版权管理。
	ARM的bootloader程序通常会在早期就会将CPU切换到非安全态。

  • ARMv7虚拟化方案 : HYP模式 下的虚拟化

HYP的引入原因
	HYP模式被作为trap和模拟需求被引入,用于在非安全态下支持虚拟化。

HYP的特点
	与其他CPU模式、用户模式和内核模式相比,HYP模式具有更高的特权。
	与内核模式相比,HYP模式将具有更少的控制寄存器。// ARM希望简化hypervisor开发人员实现hypervisor的过程





运行流
	1. 虚拟机以用户和内核模式正常运行,此时遇到 "敏感指令被触发或硬件中断"
	2. 陷入HYP模式
	3. 处理
	4. 切回之前的模式,虚拟机以用户和内核模式正常运行


可以设置切换到哪种Mode
	1. guest PL1 mode
		系统调用或用户模式的页错误引起的trap可被配置成直接陷入到虚拟机的内核模式,以便它们由guest操作系统处理,而无需hypervisor的参与。 
		// 这也就避免了每次系统调用或者页错误时进入到HYP模式,减少虚拟化的开销。
		// 当然这种方式将 PL2 的控制权减弱 ,会导致 hypervisor失去对硬件的控制
	2. host PL2 mode
		现在都是用的这种方案

可以在 host PL1 mode下 做设置(设置 guest 相关的流程陷入哪种模式)
	所有进入HYP模式的trap都可以被禁用,一个非虚拟化的内核可在内核模式下运行,并完全控制系统。	
	ARM架构运行每个trap被配置成直接切换到虚拟机的内核模式,而不是通过HYP模式来完成。
	在HYP模式下运行的软件可通过配置,使系统能够在 "敏感指令被触发或硬件中断" 的情况下从内核模式陷入到HYP模式。


  • HYP模式下的程序
HYP模式下的程序的目的
	1. 管理硬件资源,并为所有的虚拟机提供所需的隔离。
// 切换

从主机到虚拟机的world切换执行以下操作:

	1. 将所有主机GP寄存器存储在HYP的堆栈上
	2. 为虚拟机配置VGIC
	3. 配置虚拟机的时钟
	4. 将所有主机待定的配置寄存器保存到HYP堆栈中
	5. 将虚拟机的配置寄存器加载到硬件上,这可以在不影响当前执行的情况下完成,因为HYP模式使用独立于主机状态的自己的配置寄存器
	6. 配置HYP模式来捕获浮点操作,用于延迟上下文的切换、捕获中断、捕获CPU停止指令(WFI/WFE)、捕获SMC指令、陷入特定的配置寄存器访问、陷入调试寄存器访问
	7. 将特定的虚拟机ID写入影子ID寄存器
	8. 设置二级页表的基寄存器(VTTBR),并启动二级地址转换
	9. 恢复所有guest GP寄存器,并陷入用户或内核模式

从虚拟机切换回主机的world执行以下操作:
	1. 存储所有虚拟机GP寄存器
	2. 禁止二级地址转换
	3. 配置HYP模式使其能不捕获任何寄存器访问或指令
	4. 保存所有虚拟机特定的配置寄存器
	5. 将主机的配置寄存器加载到硬件上
	6. 配置主机的时钟
	7. 保存虚拟机特定的VGIC的状态
	8. 恢复所有主机GP寄存器
	9. 陷入到内核模式

おすすめ

転載: blog.csdn.net/u011011827/article/details/120473315