毕业设计 · 阶段里程碑

在 Cortex-R52 上用 Rust 实现 Hypervisor

目标平台 ST Stellar SR6P6(ARMv8-R / MPU,无页表)。定位为混合虚拟化: CPU 指令层硬件辅助、近原生;I/O 与 VM 间通信走半虚拟化(HVC)。参照 StellarSDK 的 C 实现, 用 Rust 重写核心。

阅读 / 无需运行 QEMU mps3-an536 Stellar 板 + TRACE32

A混合虚拟化定位

CPU 近原生、内存靠 MPU 静态隔离(非可重定位)、I/O 走 HVC 半虚拟化。论文的核心设计论证。

Bcore / bsp 分层

架构无关核心(HVC 分发、调度、VCB)与平台相关 BSP(内存布局、UART、时钟、MPU)分离,迁移只换 BSP。

C先仿真,后硬件

QEMU 搞懂机制、快速试错;TRACE32 + 真板子做真东西、写进论文。别让板子未知拖慢理解。

// 八个阶段

0

目标定位

~ 0.5 周细节 →

想清三件事:半虚拟化 vs 全虚拟化跑在哪范围多大。定下"混合虚拟化 + 先 QEMU"的技术路线。

交付物
  • 一页技术选型说明
  • 论文范围边界(不追 12 VM 多集群)
完成标准

能讲清为什么 R52 上选半虚拟化,而非全虚拟化。

1

架构基础 + 通读 C 参考

1–2 周细节 →

吃透 ARMv8-R / Cortex-R52:异常等级 EL2/EL1、HVC、HSR/ESR、VSCTLR、HCR、EL2 向量表、PMSA/MPU stage-2、GIC 与虚拟定时器。带着这些再通读 Stellar 的 C hypervisor。

交付物
  • 架构笔记(EL2/HVC/MPU)
  • 一次 HVC 往返的手绘时序
完成标准

能复述guest 一次 siul2_iotoggle() 如何陷入 EL2 又返回。

参照 hyper.hhyp_handler.c hyp_services.cel2_vectors.S
2

Rust 裸机练手

1–2 周细节 →

首次"运行代码"。搭 no_std 工程:target armv8r-none-eabihf、build-std、链接脚本、_start、内联汇编读写系统寄存器。QEMU 从这里正式登场。

交付物
  • Cargo + .cargo/config + .ld
  • core/bsp 分层骨架
  • 半主机 / UART 打印 "hello"
完成标准

QEMU 出字:Rust 裸机在 mps3-an536 上启动并从 UART 输出。

参照 virtLedBlink/main.cdfp/…/linker
3

MVP Hypervisor

2–4 周细节 →

整篇论文的地基。启动到 EL2 → 配一个 VM → ERET 降到 EL1 跑极简 guest → guest 发 HVC → EL2 接住、读 HSR、分发、返回。

交付物
  • EL2 向量表(先只做 HVC)
  • HVC 陷入处理 + 服务分发表
  • plat_regs / module-id enum(Rust)
完成标准

往返闭环:guest 的 HVC 请求被 EL2 处理并正确返回,可打印验证。

参照 hyper_trampoline.Shyp_handler.c hyp_services.c
4

核心机制

3–5 周细节 →

切到真板子 + TRACE32(QEMU 虚拟化特性不全)。加上真正的 hypervisor 能力:vCPU 上下文切换、时间片调度、VMM 生命周期、stage-2 MPU 隔离、GIC 中断虚拟化。

交付物
  • VmControlBlock + 上下文切换(汇编)
  • 时间片调度器 + 定时器 tick
  • MPU 隔离配置 + 越界拦截
完成标准

隔离可证:两个 VM 轮转运行,A 越界访问 B 内存被 EL2 拦截。

参照 sched.cscheduler.S vmm.cuser_mpu_config.cintc_hyp.c
5

设备半虚拟化

2–4 周细节 →

实现虚拟外设驱动对:guest 侧发 HVC(*_hvc)+ EL2 侧真操作(*_hyp)。由简到繁:虚拟 UART/LED → 虚拟定时器 →(有余力)虚拟 CAN。

交付物
  • ≥1 对虚拟外设驱动
  • VM 间通信(initiator/listener)
完成标准

半虚拟化闭环:guest 经 HVC 操作真实外设并拿到结果。

参照 siul2_hvc.csiul2_hyp.c tests/CAN
6

多核 / 多集群

可选2–3 周细节 →

单集群双核跑一个 VM → 多集群多 VM。核间同步、SMP 启动。做不完可写进"未来工作"。

交付物
  • 2 核 1 VM 场景
  • 核间同步 / spinlock
完成标准

多核可跑:两核协同承载一个或多个 VM,无竞态。

参照 tests/2cores1vmunsupported/Hypervisor
7

验证 + 论文

2–3 周细节 →

测试与量化:隔离性、调度公平性、HVC 延迟、上下文切换开销;并做 Rust vs C 参照实现在内存安全 / 可读性 / 性能上的对比——这通常是论文核心贡献。

交付物
  • 测试用例 + benchmark 数据
  • Rust/C 对比章节
  • 目标平台硬件描述章节
完成标准

可答辩:硬件上验证通过,数据与对比成文。

参照 example/Benchmarkstests/Isolation

项目运行环境

模拟阶段(P2–P3)· macOS 宿主机
Rust nightly + rust-src · armv8r-none-eabihf(tier-3,build-std)
QEMU 11.0.1 · mps3-an536 / cortex-r52
Arm GNU 工具链 15.2 · arm-none-eabi-gcc / gdb
硬件阶段(P4+)
Stellar SR6P6 开发板
Lauterbach TRACE32 · 硬件调试器
StellarSDK 6.0.1 · C 参考实现

版本由 rust-toolchain.toml(nightly + rust-src)与 .cargo/config.toml(默认目标 / build-std / QEMU runner)锁定,cargo build / cargo run 开箱即用。