夜雨聆风学习资料网

ARTICLE · 1025247

嵌入式虚拟化-xvisor-软件模块概览

嵌入式虚拟化-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 的完整技术拼图。

相关学习资料

返回首页浏览学习资料