diff --git a/docs/assets/capsule.png b/docs/assets/capsule.png
new file mode 100644
index 0000000000000000000000000000000000000000..7416e1221c5f6ac43c29a2c7054cf39b16c640f4
Binary files /dev/null and b/docs/assets/capsule.png differ
diff --git a/docs/assets/cpu_modes.png b/docs/assets/cpu_modes.png
index a89de5697c86b6f768bf605048ca35da4f80ada1..e41d2b38d08eb4e4f2f8ac29aca6a266d1246912 100644
Binary files a/docs/assets/cpu_modes.png and b/docs/assets/cpu_modes.png differ
diff --git a/docs/design.md b/docs/design.md
index 00528c63e7235fc31cf7c72fafd7754a498c8be9..747d9b105221d54168507a2c2584b4e7b6121f0b 100644
--- a/docs/design.md
+++ b/docs/design.md
@@ -1,10 +1,10 @@
本文档包含了Capsule Hypervisor的设计思路。
-# 功能性
+# 1. 功能性
Capsule Hypervisor基于软硬结合的思路,采用一套架构支持通用虚拟机(Common Virtual Machine)、安全容器(Micro-VM)、逻辑分区(Logical Partition)三种运行形态。
-## 虚拟机
+## 1.1. 虚拟机
对虚拟机的支持是Capsule Hypervisor的基本功能。为了让虚拟机能够以无差别方式运行为真实机器开发的软件,虚拟机就必须像真实的机器一样包含CPU、内存、IO设备、IO总线和其它系统组件。
@@ -13,7 +13,7 @@ Capsule Hypervisor基于软硬结合的思路,采用一套架构支持通用
虚拟CPU是一台虚拟机的核心部件,而执行指令是它的核心功能。借助硬件辅助虚拟化技术(如Intel的VT-x技术),虚拟机内部的指令可以直接在物理CPU上执行,从而提升执行性能。因此,物理CPU需要为宿主机软件和虚拟机软件准备不同的执行环境或模式。对于支持VT-x特性的Intel CPU,根模式(Root Operation)用来执行宿主机软件,而非根模式(Non-Root Operation)用来执行虚拟机软件。类似地,ARM架构的CPU使用EL0/EL2模式来执行宿主机软件,使用EL0/EL1模式来执行虚拟机软件。 尽管不同CPU体系统架构具有不同的硬件辅助虚拟化实现方式,但是基本流程是相似的,如下图所示:
-

+
对于每个虚拟CPU来说,它是宿主机上的一个普通线程,具备宿主机状态。经过一系统的初始化动作后,宿主机上的虚拟CPU线程会进入到(entry)虚拟机模式,开始按虚拟机状态发生变化。此时,大部分的虚拟机指令可以在此模式直接运行,只有当某些特殊情况发生时(如X86架构下端口操作指令访问的端口并不真实存在),物理CPU会退出(exit)回到宿主机模式,退出前虚拟机的状态会被保存,而退出后宿主机状态被恢复,物理CPU重新进入虚拟CPU线程开始仿真(emulate)虚拟机的指令(与CPU体系架构相关,需要一个个单点分析)。仿真动作完成后,物理CPU又继续回到虚拟机模式并恢复虚拟机的状态开始执行,直到下一次退出的发生。
@@ -38,17 +38,55 @@ Capsule Hypervisor基于软硬结合的思路,采用一套架构支持通用
包含虚拟机运行过程中必需的固件和传统外设。
-## 逻辑分区
+## 1.2. 逻辑分区
逻辑分区可以看成是虚拟机的一个特例,CPU、内存和外设均以独占的方式使用,无法复用和调度,实现思路如下图所示:
-

+
-其中,管理分区是Capsule Hypervisor所运行的系统,一旦某个物理CPU被分配给一个逻辑分区后,该物理CPU就会从管理分区中下线,完全脱离管理分区的管辖(无法对分区中的CPU进行任务调度),并重新进入初始化过程,进而开始执行逻辑分区中的程序;物理内存会被划分成独立的区间供不同逻辑分区命名用,通过硬件辅助虚拟化技术中的内存隔离能力可以确保不同逻辑分区不会相互干扰,但是GPA到HAP转换阶段不会产生缺页异常;此外,外部设备借助虚拟设备直通技术以独占方式被逻辑分区使用。
+其中,管理分区是Capsule Hypervisor所运行的系统,一旦某个物理CPU被分配给一个逻辑分区后,该物理CPU就会从管理分区中下线,完全脱离管理分区的管辖(无法对分区中的CPU进行任务调度),并重新进入初始化过程,进而开始执行逻辑分区中的程序;物理内存会被划分成独立的区间供不同逻辑分区使用,通过硬件辅助虚拟化技术中的内存隔离能力可以确保不同逻辑分区不会相互干扰,但是GPA到HPA转换阶段不会产生缺页异常;此外,外部设备借助虚拟设备直通技术以独占方式被逻辑分区使用。
-## 用户态与内核态接口
+## 1.3. 顶层架构
+
+通过对Capsule Hypervisor所支持的虚拟机和逻辑分区功能分析,可知从功能性角度,其整体架构如下图:
+
+
+

+
+
+Capsule Hypervisor包含内核和用户态辅助程序两部分。内核部分由Linux和Capsule Core组成,Linux为正在开发的[Rust for Linux分支](https://github.com/Rust-for-Linux/linux),Capsule Core为本项目对应代码。对于普通虚拟机和安全容器,用户态辅助程序(如StratoVirt)配合内核部分实现;而对于逻辑分区即主要由内核Capsule Core支持。Capsule Core通过一套架构两种模式支持虚拟机和逻辑分区:共享模式支持虚拟机;独占模式支持逻辑分区。
+
+### 线程模型(运行态)
+
+>* 对于普通虚拟机和安全容器形态,运行线程遵循Linux线程模型。虚拟机的每个CPU对就一个vCPU线程,所有虚拟机的设备可以共用一个IO线程,也可独占线程;所有这些线程受Linux线程调度机制管理。
+
+>* 对于逻辑分区形态,出于安全和实时性考虑,分区CPU对Linux不可见,因此需要设计一套精简的面向逻辑分区CPU的专用线程模型。
+
+### 代码目录结构(构建态)
+
+```
+capsule
+|--arch: CPU体系架构相关代码
+| |--x86: x86架构相关
+| | |--vmx: Intel的实现
+| | |--svm: AMD的实现
+| | |--xxx.rs: 架构公共代码
+| |--arm64: arm64架构相关
+|
+|--main.rs: 体系无关公共代码入口
+|--vm.rs
+|--cpu.rs
+|--memory.rs
+|--bus.rs
+|--interrupt_controller.rs
+|--irqfd.rs
+|--eventfd.rs
+|--xxx.rs
+```
+
+### 用户态与内核态接口
内核模块呈现全局唯一/dev/capsule字符设备,用户态模块通过ioctl使用全局基本功能:
>* API兼容性获取;
@@ -64,8 +102,8 @@ Capsule Hypervisor基于软硬结合的思路,采用一套架构支持通用
每个虚拟CPU对应一个字符设备,用户态模块通过ioctl使用虚拟CPU相关基本功能:
>* 开始执行,进入虚拟机模式;
-# 性能
+# 2. 性能
-# 安全性
+# 3. 安全性
-# 可靠性
+# 4. 可靠性