zCore 实训总结 - 给RVM提供riscv支持
项目概述
RVM是一个type2虚拟机,具体可移步https://github.com/rcore-os/RVM,
整个RVM体系可以分为两部分,其一是操作系统无关的,这部分是一个单独的crate叫做RVM;其二是操作系统相关的,是os内核中的一个模块,该模块使用RVM crate提供的API实现虚拟化系统调用。有了系统调用,我们就可以开发用户程序在os上跑虚拟机了。
情况分析
zCore有两种运行方式
- 直接运行在裸机上,包括zircon和rCore两个内核,zircon兼容zircon系统调用,rCore兼容linux系统调用,两个内核都是按照google的zircon内核的思想设计的,因此都有object的概念,关于object可以移步fuchsia官方文档。由于rCore兼容linux系统调用,因此直接称作linux内核。linux和zircon并不是独立的,linux直接使用了zircon的进程管理和内存管理的object,并在此基础上实现了文件系统等object。
- 运行在类unix操作系统上如linux和macos,以libos的形式运行。
libos暂时不管,只考虑第一种
目前zircon内核是没法运行在riscv平台下的,所以只能在linux内核实现虚拟化
最终目标:裸机运行riscv架构的zcore linux内核,并在os中运行用户态vmm程序
仓库地址
fork的rvm,已经移植到了riscv,需要进一步完善
GitHub - SummerVibes/RVM: Rcore Virtual Machine
fork的zcore,要给zcore中的linux内核添加rvm支持,以及完善riscv支持
GitHub - SummerVibes/zCore: Reimplement Zircon microkernel in Rust.
问题
makefile里的riscv64.img是什么,在哪弄
在zCore根目录运行 make rv64-image
https://github.com/rcore-riscv-hypervisor-dev/rust-rvm-vmm这个库是干嘛的
这是rvm的用户态实现
PLIC是什么
platform-level interrupt controller (PLIC),riscv的平台级中断控制器,接受来自外围设备的中断信号,并仲裁,根据优先级进行处理
UART是什么
Universal asynchronous receiver-transmitter,作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上,UART是计算机中串行通信端口的关键部分。类似的还有GPIO,PWM
Hart是什么
hardware thread 硬件线程,是riscv对线程所需的CPU资源的集合的称呼
kernel-hal-bare/src/arch/riscv/virtio/device_tree.rs 42行报错
已解决,有一个main函数的签名忘记改了
VMM如何截获指令,具体是怎么实现的
rcore-vmm https://github.com/rcore-os/rcore-vmm 是什么?
这是一个用C写的运行在用户态的VMM,后来又用rust重写了
prebuilt/linux/libc-libos.so是哪来的
在macos m1下能够运行但是运行gdb时报错说找不到符号表
安装riscv-gnu-toolchain就可以了,然后使用其中的riscv64-elf-unkonw-gdb就可以了
Could not load the Python gdb module from `/usr/local/share/gdb/python’.
Limited Python support is available from the _gdb module.
Suggest passing –data-directory=/path/to/gdb/data-directory.拷贝python库过去
rcore-fs-fuse 是什么
FUSE wrapper for VFS. Mount any FS to your Linux / macOS. 虚拟文件系统的用户空间文件系统包装器,用来挂载任何文件系统到unix系统
根文件系统是什么?
使linux能够运行的文件和程序的集合
make run mode=release linux=1没有出现sh
应该是我的qemu有问题,模拟x86不太行
mmio bank 是什么
像是一个集合,需要内存映射的设备的集合
sys_ioctl是干什么的
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的 传输波特率、马达的转速等等
在shell命令前加上arch=riscv64有什么用?能以不同的架构运行命令?好多命令都在前面加这个
没什么用,就是给arch这个shell变量赋值而已
userboot是什么,zcore的启动流程是怎样的
并没有riscv架构的so文件,无法在riscv上运行zircon,这个怎么办
这些so文件是根据代码编译而成的,据学长说fuchsia的编译系统属于半开源状态,而且编译器也不一定支持riscv,所以这条路怕是走不通了
zircon中的VmAddressRegion是什么
虚拟内存地址区域,也就是以前说的地址空间
riscv的中断处理方式是怎样的
rvm的接口在哪?是如何调用的
rvm的接口是给vmm用户程序使用的,rust-rvm-vmm只用到了很少的rvm功能,很多地方直接重写了rvm已有的功能
zCore没有对系统调用进行封装提供给用户程序吗
futex是什么
快速用户区互斥锁,是一个用户态系统调用,效率很高,https://zh.wikipedia.org/wiki/Futex
如何让clion中的riscv64代码高亮显示
https://doc.rust-lang.org/rust-by-example/attribute/cfg/custom.html
加载用户程序发生了panic
目前发现是rust-rvm-vmm生成的可执行程序,strip之后,bss段的offset+size>filesize,xmas-elf会对这个进行检查,所以装载失败
使用readelf可以看到offset检查失败的segment是只放了bss section,bss根本就是一个空section,不管offset是啥都无所谓,只要其物理地址正确就可以了,所以xmas-elf这种做法不太对。
学习路径
- 首先学习的是陈渝老师的高级操作系统课程,重点学习了其中讲虚拟机的章节,之后看了虚拟机黑书,重点看第一章,也就是导论,这样便建立起了对虚拟机的宏观理解。
- 之后便是看源码,丰富枝叶,结合文档看了zCore和RVM的源码,以及郭敬哲学长的rust-rvm-vmm,这一步花的时间很多。
- 运行用户程序时遇到ELF装载失败的问题,便看了《程序员的自我修养-链接、装载与库》,这本书写的非常好,解决了我的许多疑惑,这本书从理论到实践,由浅入深,讲解了Windows和Linux用户程序的装载方式,我只重点看了Linux的实现。
总结
客观上讲
学的不少,做的不多
主观上讲
本次实训对我来说意义重大,是我从用户层开发走向系统级开发的第一步,但不是最后一步,非常非常感谢这次机会,尽管很遗憾我做出的东西很少,但是学到的真的很多,如果以后另有以虚拟机为主题的活动,我一定参加
以后的规划
用rust写的虚拟机其实非常多,而且许多已经商用了,我打算去学习下这些虚拟机的设计思想,并参与源码贡献
以下几个项目是打算学习的
google的crosvm https://chromium.googlesource.com/chromiumos/platform/crosvm/
华为的stratovirt https://gitee.com/openeuler/stratovirt
aws的firecracker https://github.com/firecracker-microvm/firecracker
intel的cloud-hypervisor https://github.com/cloud-hypervisor/cloud-hypervisor
以及维护了许多rust虚拟机组件的rust-vmm组织的项目 https://github.com/orgs/rust-vmm/repositories
参考
操作系统相关
学长已经实现的加入了rvm on riscv支持的rcore
GitHub - rcore-riscv-hypervisor-dev/rcore_plus: Rust port for uCore OS, supporting x86_64 & RISCV32I
GitHub - rcore-os/zCore: Reimplement Zircon microkernel in Rust.
zcore riscv的移植进展
操作系统无关,学长已经实现的RVM on RISC-V
RISC-V 64 Hypervisor: rCore on rCore by gjz010 · Pull Request #80 · rcore-os/rCore
GitHub - rcore-riscv-hypervisor-dev/RVM: Rcore Virtual Machine
RVM WIKI
rcore-user