虚拟化平台主流hypervisor工作原理分析

1 hypervisor分类
Figure 1-1 hypervisor类型

2 GRUB简介
2.1 MBR和PBR
MBR分为GRUB.MBR和DOS.MBR。

由于硬盘上扇区从偏移0到偏移62属于同一个磁道0,虽然DOS.MBR仅占用一个扇区,但是需要将DOS.MBR后面的偏移1到偏移62保留,所以磁盘上第一个分区的第一个扇区是从偏移63开始的。fbinst软件会保留1-16064扇区,等于硬盘1个柱面的大小255 x 63 x 512 = 8MB,所以第一个分区是从扇区16065开始的。

USB-ZIP和USB-FDD会将U盘的第一个扇区格式化成DOS.PBR而不是DOS.MBR。
USB-FDD和USB-ZIP的来历:软盘的容量小,没有分区结构,所以软盘是没有MBR的,整个软盘只有一个分区,第一个扇区就是PBR;FDD和ZIP模式在DOS下启动后U盘的盘符是A。

2.2 GRUB
- GRUB又叫OS Loader;在Android系统上,kernelflinger是OS Loader的一个EFI应用
- GRUB镜像组成:GRUB.MBR(boot.img), 硬盘扇区offset 1 到offset 62放置GRUB的core.img,/boot分区的boot/grub/grub.cfg

2.3 创建USB-FDD或者USB-ZIP格式U盘步骤
1)Android上:dd if=/dev/zero of=/dev/block/sda bs=512 count=4
2)Windows上:快速格式化该U盘,这个U盘就只有PBR扇区而没有MBR扇区

3 ACRN for x86
3.1 基本介绍
ACRN是Type I型hypervisor。hypervisor的软件功能和micro kernel OS的功能很是相似,所以需要将hypervisor中的设备模拟代码从hypervisor中独立出来放到Service OS中。

内存地址虚拟化采用MMU查找EPT表实现;DMA请求地址虚拟化则有IOMMU查找IOMMU page table实现(GPA->HPA)。

ACRN启动流程:UEFI -> GRUB (Multiboot,又叫OS Loader;占用GRUB.MBR、扇区偏移1到偏移62;扇区偏移63是硬盘第一个分区的DBR) -> ACRN (acrn.efi,GRUB的剩余部分占用的分区boot) -> Service OS -> User OS

3.2 工作流程
1)hypervisor VM-Exit
- Guest指令调用触发hypervisor trap
- acrn-hypervisor/hypervisor/common/hv_main.c,void vcpu_thread(struct sched_object *obj)
- acrn-hypervisor/hypervisor/arch/x86/guest/vmexit.c
- 如果是pass through(初始化虚拟机时,devicemodel需要将Guest OS使用的PCIe BDF号映射到hypervisor中的PCIe BDF号),那么直接路由到真实硬件;否则通过中断触发SOS中的vhm驱动
2)vhm
- vhm(Virtio and Hypervisor Monitor)驱动运行在Service OS(Clear Linux)中
- 分析是要vhm驱动处理还是devicemodel处理(适用于物理设备共享),如果需要devicemodel处理,就唤醒devicemodel APP
3)devicemodel - 类似于QEMU
- acrn-hypervisor/devicemodel
- 是一个二进制daemon,运行在Service OS(Clear Linux)中,模拟Guest OS中驱动访问的物理寄存器和中断等关联到的硬件。
- 驱动节点:/dev/acrn_vhm
- 处理完毕通过vhm调用hypercall API返回hypervisor
4)hypervisor VM-Entry
- acrn-hypervisor/hypervisor/common/hypercall.c
- 返回Guest OS对应指令

3.3 驱动模型
1)DE - Device Emulation
2)PV - Paravirtualization
3)PT - Pass Through for PCI/PCIe
PCI/PCIe configuration(0xCF8/CFC)使用devicemodel emulation;其它PCI/PCIe地址直接使用passthrough。
PCIe设备被passthrough后在虚拟机中的BDF号,不一定等于其物理BDF号。

3.4 ACRNTrace和ACRNLog
hcall_setup_sbuf()
@ hypervisor/debug/hypercall.c

Tracing and Logging high-level design
https://projectacrn.github.io/latest/developer-guides/hld/hld-trace-log.html

3.5 Adress
Guest中的地址:
物理地址 - GPA
虚拟地址 - GVA

Hypervisor中的地址:
物理地址 - HPA
虚拟地址 - HVA

Guest OS调用hypervisor API时,传递的是GPA,hypervisor会将该地址转换为HPA,然后再转换为HVA(gpa2hva()),这样hypervisor代码中可以使用HVA了。实际上hypervisor也提供内部API实现GVA到GPA的转换,同时hypervisor也可以接入GVA

3.6 vm reboot命令的处理
acrn-hypervisor/devicemodel/arch/x86/pm.c
acrn-hypervisor/doc/developer-guides/hld/hld-security.rst
vm_set_suspend_mode(VM_SUSPEND_SYSTEM_RESET);

3.7 URLs
Introduction to Project ACRN
https://projectacrn.github.io/latest/introduction/index.html
https://projectacrn.github.io/latest/index.html

Device Passthrough
https://projectacrn.github.io/0.3/developer-guides/hld/hv-dev-passthrough.html

4 Linux KVM
4.1 基本介绍
KVM是Type II型hypervisor。

4.2 QEMU
QEMU提供2种机制来执行客户机指令:Tiny Code Generator(TCG)和KVM。
Linux QEMU基于KVM实现,通过/dev/kvm访问内核资源,QEMU中实现virtio的后端驱动程序。

5 Xen
5.1 基本介绍
Xen是Type I型hypervisor。hypervisor的软件功能和micro kernel OS的功能很是相似,主要负责管理CPU和内存管理(GPA <-> HPA);而将IO管理放到Service OS中。

气球膨胀(Ballooning):
由于hypervisor无法得知虚拟机中哪些内存是空闲的,因此依靠VMware Tools在Guest OS中的气球驱动(balloon driver)来回收内存。当需要从该虚拟机回收内存时,气球膨胀从Guest OS中请求内存,分配给气球驱动的内存可被hypervisor安全的回收,Guest OS自行决定将哪些内存swapping交换到硬盘上以保证分配给气球驱动内存。显然需要安装VMware Tools才能实现气球回收内存,通过这种方式回收内存较慢,依赖于Guest OS内存分配的速度。

Xen hypervisor安装到Ubuntu机器时,会修改GRUB的启动配置文件,当GRUB启动时解析配置文件后,启动Xen,然后Xen再启动Ubuntu。

5.2 VM Type
PV:Paravirtualization,半虚拟化,使用virtio技术,需要前后端驱动的配合
HVM:Hardware-assisted Virtual Machine,Intel VT-d,使用QEMU模拟硬件给Guest OS驱动使用
PVH:PV on HVM

5.3 PV virtio
5.3.1 VM之间共享内存
Xen内核驱动接口:/proc/xen/privcmd

为了使os使用xen所拥有的特权指令,xen提供了超级调用(hypercall)接口给os。半虚拟化中,超级调用和操作系统提供给应用程序使用的系统调用概念类似。不同之处在于,xen 使用82中断号,而系统调用使用80中断号。

5.3.2 VBD
Back-end驱动:
linux-2.6-kernel/drivers/xen/blkback
linux-2.6-kernel/drivers/xen/blktap

5.3.3 VNIF

5.4 xen统计vm exit
xentrace
基于Xen 的X86虚拟机性能调优 https://m.baidu.com/sf_edu_wenku/view/4529bcd328ea81c758f578b6

6 QEMU
6.1 项目URL
https://github.com/qemu/qemu?files=1
https://github.com/qemu/qemu/tree/master/hw/usb

6.2 QOM - QEMU Object Model
Qemu中的设备注册
http://ju.outofmemory.cn/entry/109800

7 QNX
7.1 hypervisor 配置文件
android.qvmconf

7.2 qvm process

8 Abbreviations
AFE:USB PHY Analog Front-end
BDF:PCIe Bus:Dev:Func;格式为DDDD:bb:dd.f,其中DDDD表示PCIe domain,通常值为0000
CSE:Converged Security Engine,Intel融合安全引擎
DRHD:DMA Remapping Hardware Unit Definition
EPT:Extended Page Table
ESXi:Vmware Elastic Sky X integrated
GPA:Guest Physical Addresses
HVA:Host Virtual Addresses
HPA:Host Physical Addresses
GSI:Global System Interrupt。它为系统中每个中断源指定一个唯一的中断号;有3个IOAPIC:IOAPIC0~2。IOAPIC0有24个管脚,其GSI base为0,每个管脚的GSI=GSI base + pin,故IOAPIC0的GSI范围为[0~23]。IOAPIC1有16个管脚,GSI base为24,GSI范围为[24,39],依次类推。ACPI要求ISA的16个IRQ应该被identify map到GSI的[0,15]。IRQ和GSI在APIC系统中常常被混用,实际上对15以上的IRQ,它和GSI相等
KVM:Kernel-based Virtual Machine
P2SB:Primary to Sideband bridge
PXE:Preboot Execution Environment
Qemu:Quick EMUlator,读作kee moo
VMCS:Virtual-Machine Control Structure

发布了121 篇原创文章 · 获赞 47 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zoosenpin/article/details/88854904
今日推荐