[TOC]
系统级虚拟化技术已经广泛应用于云计算中的数据中心等领域,是操作系统的重要组成部分。RISC-V架构支持了Hypervisor扩展,可以用于构建虚拟机应用程序,实现在一台计算机上同时运行多个操作系统,提供更好的资源划分与隔离。
另一方面,目前高校中对系统级虚拟化的 OS 教学还比较少,而现有的 OS 教学实验也存在对底层实现关注不足的情况,无法满足学有余力的同学们学习操作系统的提高要求。
因此本项目将首先用 Rust 语言编写的轻量级 hypervisor (虚拟机管理器,也叫 Virtual Machine Monitor、VMM) 模块,支持RISC-V架构的操作系统作为虚拟机运行;再将此实现过程裁剪为操作系统教学实验。一方面作为hypervisor教学,另一方面也作为更加熟悉底层细节的操作系统提高实验。
RISC-V是一种典型的精简(Reduced Instruction Set Computer,简写为RISC)指令集(Instruction Set Architecture,简写为ISA),仅有
load 和 store 指令可以访问内存。(todo再多讲一些)
RISC-V(读做“risk-five”)是一种典型的精简(Reduced Instruction Set Computer,简写为RISC)指令集(Instruction Set Architecture,简写为ISA),它是加利福尼亚大学伯克利分校的David Patterson教授与Krste Asanovic教授研究团队于2010年提出的一个开放指令集架构。名称中的“V”指的是该ISA的第五个版本,有时“V”也被解读为向量(Vector)扩展。与之前的诸多商用指令集(如x86、ARM,以及MIPS等)不同的是,RISC-V是一个开放指令集,它的提出受到了全球工业界和学术界的广泛关注。在我国,RISC-V的发展、研究和应用同样得到了广泛关注,在网信办、工信部、中科院等多个国家部委支持和指导下,中国开放指令生态(RISC-V)联盟于2018年11月8日浙江乌镇举行的第五届互联网大会上正式宣布成立。
RISC-V架构的特权手册中已经定义了Hypervisor扩展,为RISC-V架构的操作系统运行虚拟机实现支持。目前的H扩展协议版本号为0.6.1,仍然处于草案阶段。
RISC-V的虚拟化机制,在硬件上实现为:
- CPU虚拟化:增加了CPU特权级和一些特权寄存器
- 内存虚拟化:增加了一层地址转换机制
- IO虚拟化:处理虚中断与设备直通
操作系统教学离不开实验。目前国内研究型大学的进行操作系统实验的主要方法是给出一些小型操作系统作为框架代码,由学生在此基础上编写代码完成扩展。这些操作系统教学实验专注于操作系统核心概念(例如异常、页表、进程管理等),会尽可能屏蔽底层的具体操作细节。例如:
- 从执行内核第一条指令开始到真正启动操作系统并进入用户态程序会经历什么过程,其中硬件完成了什么,软件完成了什么?
- 当一个用户程序执行系统调用时会发生什么,产生什么指令,操作系统如何处理?
- ······
在现有的教学实验中,这些实现细节大多会在框架代码中给出,同学们不需要了解这些事实也可以完成实验。此要求对于普通本科生教学要求来说已经足够,但是对于学有余力的同学,如果对操作系统方向更加感兴趣,例如希望能独立开发出一个完整的操作系统,那么需要知道更加细节的过程。
预期目标分为两个部分:
预期成果是能够为RISC-V架构的操作系统增加虚拟化层,支持RISC-V架构的Linux作为虚拟机运行。具体来说,本项目使用rCore-Tutorial-v3完成所有实验后的OS作为Host。虚拟化层主要参考RVM on x86(详见文档结尾:实现参考),将RVM移植到RISC-V上。
HostOS代码将放在本仓库main分支下。
虚拟化层将作为一个crate放在仓库:(todo增加仓库链接)下。
预期成果是一套完整的教学实验,包括:
- 实验框架代码及参考实现
框架代码将按照不同的实验步骤放在不同的分支下,由同学们在框架基础上完成特定功能。目标一的成果会作为参考实现给出。
- 分阶段的实验指导书
指导书仓库地址为: https://gitlab.eduxiji.net/18603560353/project0-rvm-tutorial-book.git
指导书将给出每个实验步骤的前置知识,介绍涉及到本次实验的框架代码,介绍实验任务及测试方法。
- 测试用例及测试流程
测试用例仓库地址为:(todo增加测试用例仓库)
将在以上仓库中给出每次实验的测试用例及测试脚本。
在实现虚拟化层方面,完成了以下几个任务:
- 完成了实验框架搭建
- 能够从HostOS进入和退出GuestOS
- 能够对GuestOS的寄存器进行保存与恢复
- 能够从HostOS跳转到GuestOS的地址进行执行
- 在GuestOS发生异常与中断时,能保存GuestOS寄存器并返回HostOS中执行
- 能在HostOS中处理GuestOS发出的异常请求
- 实现HostOS对GuestOS的异常委托
目前能够运行具有简单功能的操作系统,详细说明见演示视频:(todo录制视频并上传)。
在裁剪为教学实验方面,完成了以下几个任务:
- 对实验步骤进行了初步划分
OS内核实现的功能由少到多,需要虚拟化层给出的支持也由少到多。目前按照虚拟化层实现的过程对实验步骤进行了初步划分。
- 完成了实验指导书框架
目前指导书使用了一个markdown文档列举出指导书框架和编写思路,在之后会继续完善。
继续完成迁移工作,为Hypervisor增加对GuestOS的更多支持。后续需要增加的支持为:
- 时钟中断
HostOS为GuestOS注入时钟中断,GuestOS就可以根据时钟中断进行进程调度。
- 内存隔离
todo需要贾爷
- IO
todo需要贾爷
为了将项目实现为操作系统教学实验,还需要完成以下几个步骤:
- 对实验进行更加细致的划分
目前的划分比较简单,各个实验任务量具有显著差距。例如当前版本的lab1:进入和退出GuestOS并在HostOS中处理异常,难度远高于目前的lab2:完成异常委托,此外一次性完成进入和退出OS要求的功能对同学们来说难度也较高。需要在之后将lab1拆分成4~5个实验,并增加测试用例;之后完成的labs也要控制难度并增加测试用例。
- 编写完整的实验指导书
目前的主要精力还放在完成目标一:先增加虚拟化层。为了将项目完善为完整的操作系统教学实验,还需要编写实验指导书。
- 增加测试用例和自动测试脚本
目前仅以rCore-Tutorial-v3中的不同完成度的OS作为GuestOS进行测试,以后计划编写更多形式的测试用例,包括但不限于:
- 在GuestOS中执行特定指令在HostOS中检查寄存器
- 指定GuestOS执行特定地址的指令
- ······
本实验参考了RVM和rCore-Turorial-v3。
项目地址:https://github.com/rcore-os/RVM
RVM (Rcore Virtual Machine) 是一个用 Rust 语言编写的轻量级 hypervisor模块,目前已经能够运行x86架构的虚拟机。本实验的实验框架参考了RVM,感谢RVM作者贾越凯学长的指导。
项目地址:https://github.com/rcore-os/rCore-Tutorial-v3
rCore-Tutorial-v3是一个操作系统教学项目。
本项目使用rCore-Tutorial-v3完成实验后的操作系统作为HostOS,同时将rCore-Tutorial-v3实验完成过程中具有部分功能的OS作为一部分阶段性测试用例。