06 RK3588 平台关联与使用场景详解
1. virt/ 与 Rockchip 定制
virt/ 目录无 Rockchip 补丁。RK3588 KVM 行为由 ARM64 通用 KVM + SoC CPU 特性 / IOMMU(SMMU) / GIC 决定。
平台相关启动优化(Thunder Boot 等)在 drivers/soc/rockchip/,不经过 virt/kvm。
2. 硬件与配置前提
| 条件 | 说明 |
|---|---|
| ARMv8 虚拟化扩展 | EL2 可用;arch/arm64/Kconfig select HAVE_KVM |
| GICv3/GICv4 | RK3588 典型 GIC-600 系列 → vGICv3/ITS 模型 |
| SMMU | 设备直通需 Stage-2 与 VFIO 协同 |
| 内核配置 | CONFIG_VIRTUALIZATION=y、CONFIG_KVM=y |
检查:
1 | grep -E 'Virtualization|KVM' /proc/config.gz # 或 .config |
许多 嵌入式 BSP 默认关闭 KVM 以减小内核与攻击面。
3. 典型使用场景
| 场景 | 说明 |
|---|---|
| Android 容器 / Cuttlefish | RK3588 开发板作 host,依赖 KVM + vGIC + virtio |
| ** QEMU 虚拟机** | 调试用 Linux/Windows guest |
| crosvm / Cloud Hypervisor | Rust VMM,ioctl 同 /dev/kvm |
| pKVM(若启用) | 隔离敏感 VM 免受 host 内核威胁(Android 安全方向) |
| 纯嵌入式产品 | 通常 不用 KVM,virt 代码不链入 |
4. 性能与调优触点
| 组件 | 调优 |
|---|---|
halt_poll_ns(kvm_main.c 模块参数) |
idle 退出延迟 vs host CPU |
| coalesced mmio + ioeventfd | virtio 吞吐 |
| dirty ring | 大内存 VM 迁移 |
| IRQ bypass + VFIO | 直通网卡中断延迟 |
| arch_timer | guest 时钟漂移 |
用户态工具:tools/kvm/kvm_stat(见 linuxDoc/tools)。
5. 与 RK3588 外设直通的现实限制
- GPU/NPU/VPU 多为专有驱动,非标准 PCI VFIO 场景;虚拟化常用手动 virtio-GPU 或 API 转发,而非
virt/kvm/vfio.c直通; - PCIe 网卡/USB 控制器 在具备 SMMU 时可考虑 VFIO;
- IOMMU 组 划分不当会导致 VFIO 组不完整。
6. 调试路径
| 现象 | 建议 |
|---|---|
/dev/kvm 不存在 |
检查 CONFIG_KVM、模块是否加载 kvm |
KVM_CREATE_VM 失败 |
dmesg kvm;CPU 是否支持 EL2 |
| Guest 无中断 | vgic 配置、DT 未参与 KVM,查 QEMU -machine virt,gic-version=3 |
| 直通失败 | CONFIG_VFIO、CONFIG_IRQ_BYPASS_MANAGER、SMMU 驱动 |
| EL2 panic | CONFIG_NVHE_EL2_DEBUG 打开更详细 hyp 报错 |
trace:trace/events/kvm + arch/arm64/kvm/trace_arm.h。
7. 与文档、测试
- 内核文档:
Documentation/virt/kvm/arm/index.rst - 自测:
tools/testing/selftests/kvm/(含 aarch64 QEMU 配置) - API:
Documentation/virt/kvm/api.rst
8. 配置清单(host 开发向)
1 | CONFIG_VIRTUALIZATION=y |
模块方式:
1 | modprobe kvm |
9. 小结
RK3588 上 virt/ 提供与其它架构相同的 KVM 公共 ioctl 与 IRQ/VFIO 框架;平台差异体现在 是否启用 KVM、SMMU/GIC 与 用户态 VMM。深入实现请联合 05-ARM64边界 与 BSP defconfig。
正在加载留言…