diff --git a/SUMMARY.md b/SUMMARY.md index ac7fee5e96c5059d4519a1b6994fec5cbfcff01d..1cc0c91bb4020020c94dabe57a474cbc1f48bee3 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -5,7 +5,7 @@ - 快速上手 - [虚拟平台运行](tutorial/quick-start.md) - [构建rootfs](tutorial/build-rootfs.md) - - [虚拟化Xhyp](tutorial/xhyp.md) + - [虚拟化Xhyp](programing-manual/xhyp/xhyp.md) - 内核 - [整体框架](programing-manual/base/framework.md) diff --git a/programing-manual/xhyp/figures/HS_VS.png b/programing-manual/xhyp/figures/HS_VS.png new file mode 100644 index 0000000000000000000000000000000000000000..de8546ef457a4ebb91d69f26170485127c8557bd Binary files /dev/null and b/programing-manual/xhyp/figures/HS_VS.png differ diff --git a/programing-manual/xhyp/figures/two_stages.png b/programing-manual/xhyp/figures/two_stages.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8e72a8656927e524715a33b96f1d28911e46dc Binary files /dev/null and b/programing-manual/xhyp/figures/two_stages.png differ diff --git a/programing-manual/xhyp/figures/vPLIC.png b/programing-manual/xhyp/figures/vPLIC.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb444c47eda66e03d7c70107cb9ed8e51d6d3f0 Binary files /dev/null and b/programing-manual/xhyp/figures/vPLIC.png differ diff --git a/programing-manual/xhyp/figures/worlds.png b/programing-manual/xhyp/figures/worlds.png new file mode 100644 index 0000000000000000000000000000000000000000..c5494e578c3cb9c5d2c77af305bc0974cb1e4335 Binary files /dev/null and b/programing-manual/xhyp/figures/worlds.png differ diff --git a/tutorial/xhyp.md b/programing-manual/xhyp/interface.md similarity index 37% rename from tutorial/xhyp.md rename to programing-manual/xhyp/interface.md index c22c19289bb610e07fef53a446263f29e49dcb89..dd03e3430427b7677a20906a5b6bf40974647f01 100644 --- a/tutorial/xhyp.md +++ b/programing-manual/xhyp/interface.md @@ -1,11 +1,3 @@ -# `Xhyp` 虚拟化框架设计与实现 -## 更新时间:2023-11-09 - -### 项目简介 -`Xhyp` 项目是经过对 `nxos` 内核进行修改而实现的 `Type-1` 型虚拟化框架,其最终的目标是在单板系统上启动并运行多种操作系统,包括 `Linux`、`nxos` 以及一些流行的实时操作系统等。 - -项目目前仅面向 `RISC-V` 指令集架构进行初步的开发。 - ### 虚拟化框架接口设计 #### 虚拟机状态控制 在 `nxos` 内核中创建相关的数据结构,记录系统虚拟化状态以及虚拟机相关状态,设计相关接口如下表。 @@ -40,49 +32,3 @@ 目前仅针对虚拟机实现了最基本的串口设备直通功能,满足基本的虚拟机输入输出。 后续会针对需求,进一步完善 `I/O` 虚拟化方式。 - -### 虚拟化框架实现计划和进度 -#### 实现计划 -虚拟化有多种实现,按照 `CPU` 是否按照调度,可以简单分为静态分区(`Static Partition Hypervisor, SPH`)和动态调度两种实现。 - -前者较为典型的实现是西门子的 `Jailhouse` 和 `Bao-hypervisor`,后者则有开源项目 `minos` 可供借鉴。 - -### 使用指南 -#### 临时修改 -本项目在主线多合并后出现了一些小问题,暂时需要回滚到提交版本: -`git reset --hard 9f16e9f` - -#### 项目编译 -`nxos` 的虚拟化功能 `xhyp` 并不是默认开启的功能,需要使用者在编译前简单修改配置。 - -参考 [编译与运行](https://gitee.com/BookOS/nxos-documentation/blob/master/tutorial/quick-start.md) 文档依次输入命令。在输入 `make menuconfig` 的时候,在 `OS Kernel -> xhyp - nxos virtualization -> Using NXOS as hypervisor` 下开启虚拟化功能 `xhyp`,如下图所示。 - -![在配置菜单中开启虚拟化功能1](../programing-manual/xhyp/figures/menuconfig.png) - -此外,还需要在 `Hook system` 中打开 `thread context switch` 选项,如下: - -![在配置菜单中开启虚拟化功能2](../programing-manual/xhyp/figures/hook.png) - -#### 文件补充 -在运行前,还需要补充 `3` 个相关的[文件](../programing-manual/xhyp/misc),分别是: - -文件 | 路径 | 备注 ---- | --- | --- -`rootfs.cpio` | `nxos/` | -`romdisk.S` | `nxos/src/drivers/block/` | -`gos.bin` | `nxos/src/platform/qemu_riscv64/tools/` | `Guest OS` 镜像文件 - -#### 运行指令 -完成上述操作后,在顶级目录下执行 `make run`,就会开始编译并运行,如下图所示。 - -![xhyp 命令菜单](../programing-manual/xhyp/figures/cmd.png) - -然后可以使用 `xhyp` 命令创建、运行虚拟机,具体如下: - -`xhyp -n 0`,创建虚拟机: - -![xhyp 创建虚拟机](../programing-manual/xhyp/figures/create.png) - -`xhyp -r 0`,运行虚拟机: - -![xhyp 运行虚拟机](../programing-manual/xhyp/figures/run.png) diff --git a/programing-manual/xhyp/plan.md b/programing-manual/xhyp/plan.md new file mode 100644 index 0000000000000000000000000000000000000000..716cbb21e783936a30dd939269f18d203fa20843 --- /dev/null +++ b/programing-manual/xhyp/plan.md @@ -0,0 +1,14 @@ +### 虚拟化框架实现计划和进度 +#### 实现计划 +虚拟化有多种实现,按照 `CPU` 是否支持调度,可以简单分为**静态分区(`Static Partition Hypervisor, SPH`)**和**动态调度**两种实现。 + +前者较为典型的实现是西门子的 `Jailhouse` 和 `Bao-hypervisor`,后者则有开源项目 `minos` 可供借鉴。 + +静态分区,即所有的系统资源在运行之前已经规划好如何分配,在系统运行的过程中无法 +变更。这种方法的优点在于 `CPU` 资源为某个操作系统独占,无需进行上下文切换,省去了中间进行状态变更的损耗。缺点在于会降低系统资源的利用率,尤其是在独占 `CPU` 资源的操作系统任务轻时,`CPU` 资源就会闲置浪费。 + +动态调度,可以参考 `KVM` 和 `minos` 等设计实现,将每个虚拟机看作是一个进程(或将每个虚拟机中的 `CPU` 视为一个线程),在运行的过程中支持线程、进程的调度。这种做法的优缺点与静态分区方式恰恰相反:在配置合理的情况下,线程、进程调度有利于虚拟机充分利用 `CPU` 资源,提升系统资源利用率;缺点则是上下文切换过程会带来一定的损耗,并且在实时性上难以保证。 + +综上,实时性要求高的系统使用静态分区更好,而注重系统吞吐量的系统(软实时或非实时系统)使用动态调度更好。 + +本项目现已初步支持静态分区的虚拟化方式,后续将会逐步完善,并逐步转向动态调度的实现。 diff --git a/programing-manual/xhyp/usage.md b/programing-manual/xhyp/usage.md new file mode 100644 index 0000000000000000000000000000000000000000..24db0e91c3c5df644d7e7ab5733a6da9a60d7636 --- /dev/null +++ b/programing-manual/xhyp/usage.md @@ -0,0 +1,39 @@ +### 使用指南 +#### 临时修改 +本项目在主线多合并后出现了一些小问题,暂时需要回滚到提交版本: +`git reset --hard 9f16e9f` + +#### 项目编译 +`nxos` 的虚拟化功能 `xhyp` 并不是默认开启的功能,需要使用者在编译前简单修改配置。 + +参考 [编译与运行](https://gitee.com/BookOS/nxos-documentation/blob/master/tutorial/quick-start.md) 文档依次输入命令。在输入 `make menuconfig` 的时候,在 `OS Kernel -> xhyp - nxos virtualization -> Using NXOS as hypervisor` 下开启虚拟化功能 `xhyp`,如下图所示。 + +![在配置菜单中开启虚拟化功能1](./figures/menuconfig.png) + +此外,还需要在 `Hook system` 中打开 `thread context switch` 选项,如下: + +![在配置菜单中开启虚拟化功能2](./figures/hook.png) + +#### 文件补充 +在运行前,还需要补充 `3` 个相关的[文件](./misc/romdisk.S),分别是: + +文件 | 路径 | 备注 +--- | --- | --- +`rootfs.cpio` | `nxos/` | +`romdisk.S` | `nxos/src/drivers/block/` | +`gos.bin` | `nxos/src/platform/qemu_riscv64/tools/` | `Guest OS` 镜像文件 + +#### 运行指令 +完成上述操作后,在顶级目录下执行 `make run`,就会开始编译并运行,如下图所示。 + +![xhyp 命令菜单](./figures/cmd.png) + +然后可以使用 `xhyp` 命令创建、运行虚拟机,具体如下: + +`xhyp -n 0`,创建虚拟机: + +![xhyp 创建虚拟机](./figures/create.png) + +`xhyp -r 0`,运行虚拟机。具体效果如下: + +![xhyp 运行虚拟机](./figures/run.png) diff --git a/programing-manual/xhyp/virt_riscv.md b/programing-manual/xhyp/virt_riscv.md new file mode 100644 index 0000000000000000000000000000000000000000..5a662b0409cf2c0492b3e8f175c1cc44624039a5 --- /dev/null +++ b/programing-manual/xhyp/virt_riscv.md @@ -0,0 +1,39 @@ +### RISC-V虚拟化简介 + +`RISC-V` 的虚拟化内容主要包括如下几个方面: +- `CPU` 虚拟化 +- 内存虚拟化 +- 中断虚拟化 +- `I/O` 虚拟化 +- `Timer` 虚拟化 + +#### `CPU` 虚拟化 + +在不考虑虚拟化情况下,为了支持不同的应用场景,`RISC-V` 提供了不同的特权级别,`RISC-V` 规范中定义了三种特权模式:`Machine mode`, `Supervisor mode` 和 `User Mode`。可以对这三种模式进行不同的组合以满足不同的应用需求: + +- 简单的嵌入式系统(比如低端 `IOT` 设备)一般只需要 `Machine mode` +- 对于需要一定保护但不需要 `MMU` 支持的嵌入式系统一般需要 `Machine mode` 与 `User mode` +- 对于需要运行带 `MMU` 能力的复杂系统,比如 `Linux` 或者 `Windows`,则一般需要同时支持 `Machine mode`,`Supervisor mode` 和 `User mode` 三种模式。 + +为了支持虚拟化,`RISC-V` 规范定义了 `RISC-V H-extension`,在原来的三级特权架构的基础上,对原有的 `Supervisor` 模式进行了扩展,引入了 `Hypervisor-Extended Supervisor mode (HS)`。 + +![虚拟化新增模式](./figures/HS_VS.png) + +引入 `H-extension` 后,带 `Hypervisor` 功能的软件栈可以如下: + +![软件栈](./figures/worlds.png) + +在 `Machine Mode` 下运行最高优先级的,对全部资源具备操作能力的 `Firmware` (比如 `openSBI`),虚拟机软件 `Hypervisor` 运行在 `HS` 模式,虚拟机(`Guest OS`)运行在虚拟化的 `Supervisor` 模式,应用程序继续运行在虚拟操作系统之上,运行在`Virtualized User mode`。 + +#### 内存虚拟化 + +`RISC-V` 虚拟化扩展支持硬件内存虚拟化技术,即虚拟化两阶段地址映射,如图所示: + +![两阶段地址映射](./figures/two_stages.png) + +#### 中断虚拟化 + +`RISC-V` 的中断虚拟化目前还不够完善,主要采用:**虚拟中断注入**和**陷入与模拟技术**,即每次接受一个虚拟中断都需要陷入 `VMM` 中进行模拟。 +`RISC-V` 使用 `PLIC` 中断控制器,但是目前 `PLIC` 规范中还没有实现 `PLIC` 虚拟化,所以需要在 `VMM` 中为虚拟机模拟虚拟 `PLIC`(`vPLIC`)。 + +![中断虚拟化过程](./figures/vPLIC.png) diff --git a/programing-manual/xhyp/xhyp.md b/programing-manual/xhyp/xhyp.md new file mode 100644 index 0000000000000000000000000000000000000000..84cf04ab4b6d7ead50a7bf7ed124de78e2d8c85c --- /dev/null +++ b/programing-manual/xhyp/xhyp.md @@ -0,0 +1,17 @@ +# `Xhyp` 虚拟化框架设计与实现 +## 更新时间:2023-11-09 + +## 目录 +* [主页](./xhyp.md) + * [Xhyp使用快速上手](./usage.md) + * [RISC-V虚拟化简介](./virt_riscv.md) + * [Xhyp框架接口设计](./interface.md) + * [Xhyp实现计划和进度](./plan.md) + +### 项目简介 +虚拟化技术是一种资源管理技术,本质上是对系统资源的抽象、池化,灵活组合成多个电脑配置环境。 +虚拟化资源一般包括计算(CPU+内存)、网络和存储等。 + +`Xhyp` 项目是经过对 `nxos` 内核进行修改而实现的 `Type-1` 型虚拟化框架,其最终的目标是在单板系统上启动并运行多种操作系统,包括 `Linux`、`nxos` 以及一些流行的实时操作系统等。 + +项目目前仅面向 `RISC-V` 指令集架构进行初步的开发。