From 15fd5a7e19b48c188c190a8e2b2b4fd535b7774d Mon Sep 17 00:00:00 2001 From: Suqier Date: Mon, 18 Dec 2023 17:52:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85Xhyp=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Suqier --- SUMMARY.md | 2 +- programing-manual/xhyp/figures/HS_VS.png | Bin 0 -> 24698 bytes programing-manual/xhyp/figures/two_stages.png | Bin 0 -> 24492 bytes programing-manual/xhyp/figures/vPLIC.png | Bin 0 -> 31956 bytes programing-manual/xhyp/figures/worlds.png | Bin 0 -> 21697 bytes .../xhyp/interface.md | 54 ------------------ programing-manual/xhyp/plan.md | 14 +++++ programing-manual/xhyp/usage.md | 39 +++++++++++++ programing-manual/xhyp/virt_riscv.md | 39 +++++++++++++ programing-manual/xhyp/xhyp.md | 17 ++++++ 10 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 programing-manual/xhyp/figures/HS_VS.png create mode 100644 programing-manual/xhyp/figures/two_stages.png create mode 100644 programing-manual/xhyp/figures/vPLIC.png create mode 100644 programing-manual/xhyp/figures/worlds.png rename tutorial/xhyp.md => programing-manual/xhyp/interface.md (37%) create mode 100644 programing-manual/xhyp/plan.md create mode 100644 programing-manual/xhyp/usage.md create mode 100644 programing-manual/xhyp/virt_riscv.md create mode 100644 programing-manual/xhyp/xhyp.md diff --git a/SUMMARY.md b/SUMMARY.md index ac7fee5..1cc0c91 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 GIT binary patch literal 24698 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 literal 0 HcmV?d00001 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 GIT binary patch literal 24492 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 W>s_(xwocGz=k(9(<>_9&`~LuBA<0ny literal 0 HcmV?d00001 diff --git a/programing-manual/xhyp/figures/worlds.png b/programing-manual/xhyp/figures/worlds.png new file mode 100644 index 0000000000000000000000000000000000000000..c5494e578c3cb9c5d2c77af305bc0974cb1e4335 GIT binary patch literal 21697 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 VB%>8qmzsc_=;`X`vd$@?2>?|w*-iie literal 0 HcmV?d00001 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 c22c192..dd03e34 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 0000000..716cbb2 --- /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 0000000..24db0e9 --- /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 0000000..5a662b0 --- /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 0000000..84cf04a --- /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` 指令集架构进行初步的开发。 -- Gitee