ARTICLE · 1025247
嵌入式虚拟化-xvisor-软件模块概览
Xvisor 采用高度模块化的 Type-1 虚拟机监控程序(Hypervisor)设计,其将底层硬件与上层虚拟化逻辑严格解耦。我将xvisor粗略按照目录划分为模块。我将 Xvisor 的主要软件模块、核心功能(CPU虚拟化、中断虚拟化、内存虚拟化、设备与I/O虚拟化等)以及代表性函数接口进行了全面系统的梳理与提炼:
一、 核心通用层与子模块 (core/)
1. core - 核心通用层
负责虚拟机的生命周期管理、线程模型、时钟与定时器管理。
虚拟机与 VCPU 管理 (
vmm_manager.h):struct vmm_guest *vmm_manager_guest_create(struct vmm_devtree_node *gnode)—— 基于设备树配置创建 Guest 虚拟机实例。struct vmm_vcpu *vmm_manager_vcpu_orphan_create(...)—— 创建孤立的 VCPU(或者称为 Hypervisor 后台线程)。int vmm_manager_guest_reset(struct vmm_guest *guest)—— 重置/复位指定的虚拟机。int vmm_manager_guest_kick(struct vmm_guest *guest)—— 唤醒/触发虚拟机运行。VCPU 调度器 (
vmm_scheduler.h):int vmm_scheduler_state_change(struct vmm_vcpu *vcpu, u32 new_state)—— 改变 VCPU 的状态(如就绪、运行、挂起等)。int vmm_scheduler_force_resched(u32 hcpu)—— 强制指定物理 CPU (hcpu) 重新调度。void vmm_scheduler_irq_enter(arch_regs_t *regs, bool vcpu_context)—— 处理中断进入。内存地址空间与虚拟化内存映射:
int vmm_guest_physical_map(struct vmm_guest *guest, physical_addr_t gphys_addr, physical_size_t gphys_size, physical_addr_t hphys_addr, u32 flags)—— 建立 Guest 物理地址 (GPA) 到 Host 物理地址 (HPA) 的映射(内存虚拟化核心接口)。u32 vmm_guest_memory_read(struct vmm_guest *guest, physical_addr_t gphys_addr, void *dst, u32 len, bool cacheable)—— 读 Guest 内存。u32 vmm_guest_memory_write(struct vmm_guest *guest, physical_addr_t gphys_addr, void *src, u32 len, bool cacheable)—— 写 Guest 内存。中断虚拟化 (
vmm_vcpu_irq.h):void vmm_vcpu_irq_assert(struct vmm_vcpu *vcpu, u32 irq_no, u64 reason)—— 向指定的 VCPU 断言(触发)虚拟中断。void vmm_vcpu_irq_deassert(struct vmm_vcpu *vcpu, u32 irq_no)—— 清除/撤销 VCPU 的虚拟中断。void vmm_vcpu_irq_clear(struct vmm_vcpu *vcpu, u32 irq_no)—— 清除虚拟中断状态。时钟与定时器 (
vmm_timer.h):u64 vmm_timer_timestamp(void)—— 获取当前的统一时钟时间戳。int vmm_timer_event_start2(struct vmm_timer_event *ev, u64 duration_nsecs, u64 *ret_expiry_tstamp)—— 启动定时器事件。Hypervisor 线程 (
vmm_threads.h):int vmm_threads_start(struct vmm_thread *tinfo)/vmm_threads_stop(...)—— 启动或停止后台线程。
2. core/schedalgo - 核心调度层
定义通用的可插拔调度算法接口:
int vmm_schedalgo_rq_enqueue(void *rq, struct vmm_vcpu *vcpu)—— 将 VCPU 压入就绪队列。int vmm_schedalgo_rq_dequeue(void *rq, struct vmm_vcpu **next, u64 *next_time_slice)—— 从就绪队列弹出下一个调度的 VCPU。int vmm_schedalgo_vcpu_cleanup(struct vmm_vcpu *vcpu)—— 清理调度上下文。
3. core/block - 核心块层
存储虚拟化的通用块设备框架:
int vmm_blockdev_register(struct vmm_blockdev *bdev)—— 注册物理或虚拟块设备。int vmm_blockdev_submit_request(struct vmm_blockdev *bdev, struct vmm_request *r)—— 提交块 I/O 请求。u64 vmm_blockdev_rw(struct vmm_blockdev *bdev, enum vmm_request_type type, u8 *buf, u64 off, u64 len)—— 读写块设备数据。
4. core/net - 核心网络层
轻量级包交换网络框架:
int vmm_netswitch_init(void)—— 初始化网络包交换机。int vmm_netport_free(struct vmm_netport *port)—— 释放网络端口。
二、 架构相关虚拟化层 (arch/)
这些模块负责具体硬件架构(如 ARM32, ARM64, RISC-V)的底层硬件辅助虚拟化(如 ARM 的 EL2 虚拟化扩展、Stage-2 页表管理、异常捕获与注入):
代表性功能:
陷阱处理(Trap and Emulate):捕获 Guest 的特权指令、MSR/MMIO 访问。
架构寄存器上下文切换 (
arch_regs_t)。硬件辅助的页表映射与 TLB 管理。
三、 物理驱动与工具层 (drivers/, tools/)
1. drivers - 物理驱动层
实现了类似于 Linux 内核的设备驱动模型(Bus、Device、Driver)。
int vmm_devdrv_register_bus(struct vmm_bus *bus)—— 注册总线。int vmm_devdrv_bus_register_driver(struct vmm_bus *bus, struct vmm_driver *drv)—— 注册驱动。
2. tools - 开发与设备树工具
int vmm_devtree_init(void)—— 初始化设备树解析。int vmm_devtree_regmap(struct vmm_devtree_node *node, virtual_addr_t *addr, int regset)—— 根据设备树映射寄存器地址。u32 vmm_devtree_irq_count(struct vmm_devtree_node *node)—— 获取设备树中的中断数量。
四、 模拟设备与 I/O 虚拟化层 (emulators/)
1. emulators - 模拟设备核心框架
负责 MMIO 读写拦截与分发:
int vmm_devemu_emulate_read(struct vmm_vcpu *vcpu, physical_addr_t gphys_addr, void *dst, u32 dst_len, enum vmm_devemu_endianness dst_endian)—— 模拟读内存/MMIO。int vmm_devemu_emulate_write(struct vmm_vcpu *vcpu, physical_addr_t gphys_addr, void *src, u32 src_len, enum vmm_devemu_endianness src_endian)—— 模拟写内存/MMIO。int vmm_devemu_simple_read32(struct vmm_emudev *edev, physical_addr_t offset, u32 *dst)—— 简化的 32 位设备寄存器读取。
2. 子模拟设备模块:
emulators/virtio(virtio设备):u16 vmm_virtio_queue_pop(struct vmm_virtio_queue *vq)—— 弹出一个 VirtIO 请求队列描述符。int vmm_virtio_queue_get_desc(struct vmm_virtio_queue *vq, u16 indx, struct vmm_vring_desc *desc)—— 获取 VirtIO 描述符。emulators/pic(模拟中断设备):处理虚拟中断控制器(如 vGIC、vPLIC)的模拟。emulators/serial/block/net/display/pci/cache:对应串口、块设备、网络、显示、PCI 总线以及缓存的虚拟化实现。
五、 调试命令、守护线程与基础库 (commands/, daemons/, libs/)
commands- 调试命令:int vmm_cmdmgr_register_cmd(struct vmm_cmd *cmd)—— 注册控制台调试命令。int vmm_cmdmgr_execute_cmd(struct vmm_chardev *cdev, int argc, char **argv)—— 执行命令。daemons:后台守护线程。libs:基础运行库(提供字符串处理、红黑树、链表等基础数据结构)。
后续分析拼图基础
通过上述拆分,我将Xvisor 的功能全景图被清晰地划分为了 CPU 虚拟化(arch/ + core/vmm_manager.c + core/vmm_scheduler.c)、内存虚拟化(core/vmm_guest_aspace.h + arch/页表管理)、中断虚拟化(core/vmm_vcpu_irq.h + emulators/pic)、以及I/O与设备虚拟化(emulators/ + core/block)。模块架构示意图如下:

有了这些代表性函数接口作为锚点,后续我们将能够以这些接口为轴心,逐一深入分析每个分离软件模块的底层源码实现,从而彻底拼出 Xvisor 的完整技术拼图。