概述
1 GRUB简介
1.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。
1.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
1.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扇区
2 IOMMU
2.1 ARM SMMU
iommus = <&apps_smmu 0x300 0>:中间的数字0x300就是设备的Stream ID,执行DMA请求时,SMMU根据Stream ID找到设备在DDR中的STE(Stream Table Entry)。PCI的Stream ID等于BDF号。
SSID:Substream ID。ste.S1CDMax为0表示STE只支持一个CD(Context Descriptor),不需要使用SSID,如果S1CDMax不为0,那么支持的CD数目是2 ^ S1CDMax。当往STE中写入S1DSS = SSID0时就禁止了SSID功能。
TBU: Translation Buffer Unit for TLB
TCU: Translation Control Unit for Page Table Walks
2.2 x86 IOMMU
When a PCI device is assigned, KVM/QEMU call intel_iommu_page_mapping() to build VT-d DTE (Device Table Entry) to map the entire guest memory.
Kernel parameter intel_iommu=pt to set up pass through mode in context mapping entry. This disables DMAR in Linux kernel; but KVM still runs on VT-d and interrupt remapping still works.
In this mode, kernel uses swiotlb for DMA API functions but other VT-d functionalities are enabled for KVM. KVM always uses multi level translation page table in VT-d. By default, pass though mode is disabled in kernel.
1)在虚拟化场景下,直通设备的中断是无法直接投递到Guest中的,而是由IOMMU截获中断,先将其中断映射到host的某个中断上,然后再重定向(由VMM写VMCS寄存器中的32 bits VM-entry interruption-information字段)到Guest内部。
2)IOMMU IRTE(Interrupt Remapping Table Entry,128bit)中的Destination ID字段指明中断要投递的CPU的APIC ID信息,vector字段指明中断号,VMM会为每个中断源分配一个IRTE,并且把guest分配的vector号填入到IRTE的vector域。
3)在进入guest执行前,kvm是关中断的,在VM-Exit完全恢复了host上下文后,才开中断。关中断是在vcpu_enter_guest函数中调用了local_irq_disable,开中断是在这个函数从kvm_x86_ops->run返回后(即VM-Exit后)调用local_irq_enable。
4)guest vcpu执行时,物理中断发生,导致VM-Exit,但是此时是关中断的,所以硬件不会响应中断,中断处于pending,在开中断后,硬件发现pending中断并开始响应,此时已经在host上下文中,IDT(Interrupt Descriptor Table)已经指向host的IDT,物理中断由host handler来处理。
2.3 ARM SMMU showcase
Master IP - vGEN - SMMU (S1, DVA - IPA) - S2MPU (S2, IPA = PA) - DRAM
vGEN runs in EL2 Hypervisor.
SMMU runs in EL1 Linux.
S2MPU runs in EL2 Hypervisor.
3 QNX
3.1 hypervisor 配置文件
android.qvmconf
3.2 qvm process
1)qvm透传PCI/PCIe MMIO方法是使用mmap()将其BAR所指向的物理内存映射到自己的进程地址空间中,并注册到MMU EPT中,给其上的虚拟机使用(譬如Android)。
2)qvm进程中注册PCI/PCIe ISR,物理中断产生时,qvm将中断inject到vCPU(参考Linux QEMU vfio_msihandler)。
3)PCI/PCIe配置空间没有透传(参考QEMU VFIO quirk机制),所以Android虚拟机访问PCI/PCIe配置空间时,会进入qvm进程中,qvm使用QNX的API读写数据后,再VMEntry进入Android。
4)KVM arch/arm64/kvm/hyp/switch.c
kvm_vcpu_run_vhe()
vhe: Virtualization Host Extension
3.3 arm64 gpio interrupt pass through
qcom sa6155 gpio能够pass through的中断号只有8个,从241到248,这些中断号不是使用gpio_to_irq()转换而来的。
4 ACRN for x86
4.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
4.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对应指令
4.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号。
4.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
4.5 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);
5 GPU虚拟化
5.1 x86_64
1) AMD SR-IOV
2) Intel GVT-g
Intel采用了Mediated Pass-Through(mdev),其实现比SR-IOV GPU简单,因为需要trap VM中的vGPU的MMIO访问,所以会有性能损失。
5.2 iMX8
iMX8有2个GPU GC7000。
5.3 Samsung 8nm EA9
Mali MP12: 12 clusters, is an integrated high-end graphics card, it was introduced in October 2017
Mali MP3: 3 clusters, is an integrated mid-range graphics card, it was introduced early 2018
Samsung EA9 includes 3 GPU, GPU00 (MP3, Gondul) and GPU01 (MP3) located in Linux, GPU1 (MP12, Norr) located in Android VM.
6 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
HECI:Host Embedded Controller Interface,Host OS和x86 ME的通信接口,只有4pin,分别是REQ#、GNT#、TX和RX,目的是为了代替SMBus
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
MCP: Linux Master Compositor
P2SB:Primary to Sideband bridge
PXE:Preboot Execution Environment
Qemu:Quick EMUlator,读作kee moo
VMCS:x86 Virtual-Machine Control Structure
最后
以上就是秀丽未来为你收集整理的虚拟化平台主流hypervisor工作原理分析的全部内容,希望文章能够帮你解决虚拟化平台主流hypervisor工作原理分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复