2. 虚拟化基础

在ARM平台移植与启动工程中,虚拟化不是“额外功能”,而是决定系统启动路径、异常级别划分和资源归属的基础设施。理解虚拟化技术分类、Hypervisor的工作位置,以及Xen的架构模型,是后续分析Xen on ARM启动流程、Domain0构建和Guest创建的前提。

2.1 虚拟化技术分类

虚拟化按抽象层次可分为几类:全虚拟化(Full Virtualization)中,Guest OS无需修改,敏感指令由Hypervisor动态二进制翻译或硬件辅助捕获;半虚拟化(Paravirtualization)要求Guest OS显式调用Hypervisor提供的hypercall,性能更好但需修改内核;硬件辅助虚拟化利用CPU提供的虚拟化扩展,如ARM的EL2异常级别和Stage-2地址翻译,让敏感指令自然陷入;容器化则共享同一内核,通过命名空间和cgroup隔离,不属于严格意义的系统虚拟化。

在ARMv8-A上,虚拟化扩展引入了EL2,Hypervisor运行在EL2,Guest OS运行在EL1,用户态在EL0。这种层级划分直接决定了启动时异常级别的切换顺序。

2.2 Hypervisor原理

Hypervisor(虚拟机监控器)的核心职责是资源抽象、隔离与调度。它需要完成:CPU虚拟化(vCPU调度与上下文切换)、内存虚拟化(Stage-2翻译,将Guest物理地址映射到Host物理地址)、中断虚拟化(虚拟中断控制器vGIC)、设备虚拟化(模拟设备或直通)。

当Guest执行敏感指令时,CPU会陷入EL2,Hypervisor捕获后模拟或转发。以内存访问为例,Guest的虚拟地址先经Stage-1翻译为Guest物理地址,再经Stage-2翻译为Host物理地址,两次翻译由硬件协同完成。中断路径上,物理中断先到EL2,Hypervisor注入虚拟中断给Guest。

关键点:Hypervisor不是“拦截所有指令”,而是依赖硬件机制只处理敏感操作。ARM的HCR_EL2、VTTBR_EL2、ICH_*等寄存器是控制虚拟化行为的关键。

2.3 Type-1与Type-2对比

按部署位置,Hypervisor分为Type-1(裸机型)和Type-2(宿主型)。Type-1直接运行在硬件上,如Xen、KVM(内核态形态常被归为Type-1变体)、VMware ESXi;Type-2运行在宿主OS之上,如VirtualBox、VMware Workstation。两者在启动链、性能、适用场景上差异明显。

对比维度 Type-1 裸机型 Type-2 宿主型
运行位置 直接运行在硬件/EL2 运行在宿主OS用户态或内核态
启动依赖 先启动Hypervisor,再启动Guest 先启动宿主OS,再启动Hypervisor
性能开销 较低,路径短 较高,需经过宿主OS
典型代表 Xen、ESXi VirtualBox、Workstation
适用场景 服务器、嵌入式、云平台 桌面开发、测试验证

2.4 Xen架构概述

Xen是典型的Type-1 Hypervisor,采用微内核式设计:Hypervisor本身只负责CPU调度、内存管理和中断控制,设备驱动和复杂服务放在特权域中。Xen on ARM的架构中,最关键的组件是Domain0(Dom0),它是启动后第一个创建的Guest,拥有真实设备驱动,负责管理其他Guest(DomU)的创建、配置和资源分配。

Xen的启动链通常为:Bootloader加载Xen Hypervisor → Xen初始化EL2环境 → 创建Dom0 → Dom0启动内核与用户态 → 通过工具栈(xl/libxl)创建DomU。在ARM平台上,设备树(Device Tree)用于向Xen和Dom0传递硬件信息,中断和时钟通过GIC与Generic Timer虚拟化。

# Xen on ARM 典型启动参数示例(U-Boot)
setenv bootargs "console=dtuart dtuart=serial0 dom0_mem=1024M"
booti 0x40000000 - 0x43000000 xen.dtb
# 加载顺序:xen Image -> Dom0 kernel -> Dom0 dtb

Xen的组件关系可以概括为:Hypervisor在EL2提供基础虚拟化;Dom0在EL1作为特权Guest,运行驱动和工具;DomU在EL1作为普通Guest,通过前端/后端驱动与Dom0通信。前端驱动在DomU中,后端驱动在Dom0中,两者通过XenBus和共享内存环传递I/O请求。

Xen on ARM 架构与异常级别关系 EL0 用户态 Dom0 用户态 (xl/libxl) DomU 用户态 EL1 Guest OS Dom0 内核 后端驱动 / 真实驱动 DomU 内核 前端驱动 XenBus / 共享环 EL2 Xen Hypervisor vCPU 调度 Stage-2 内存 vGIC 中断 Hypercall ARMv8-A 硬件 CPU (EL0-EL2) GIC / Timer MMU Stage-2 EL0 EL1 EL2

2.5 常见误区与复盘

  • 误区一:把Xen当成Type-2。Xen直接运行在硬件EL2,属于Type-1;Dom0只是特权Guest,不是宿主OS。
  • 误区二:认为Dom0就是“宿主机内核”。Dom0内核运行在EL1,受Xen调度和Stage-2内存约束,并非无限制的宿主。
  • 误区三:忽略异常级别切换。ARM上Xen启动涉及EL3→EL2→EL1的切换,Bootloader需正确设置EL2入口和寄存器。
  • 误区四:设备树配置错误。Xen和Dom0需要各自的DTB,中断、内存节点配置不一致会导致Dom0启动失败。
排查Xen启动问题时,优先确认:当前异常级别是否为EL2、HCR_EL2是否使能虚拟化、Dom0内存是否与Xen保留内存冲突、串口是否被正确指定为dtuart。

掌握以上分类、原理与架构关系后,后续分析Xen的启动镜像布局、Dom0构建流程以及Guest创建时,就能把每一步操作对应到具体的异常级别和组件职责上,而不是停留在命令表面。