From 06052cff7843f464d2f3bcda9d9bd5d78bd0d862 Mon Sep 17 00:00:00 2001 From: Bin Wu Date: Fri, 24 Sep 2021 16:22:59 +0800 Subject: [PATCH] docs: add the designing doc Add the designing document which describes the functionality of the Capsule hypervisor. Signed-off-by: Bin Wu --- README.en.md | 6 ++++-- README.md | 8 +++++--- docs/assets/cpu_modes.png | Bin 0 -> 47768 bytes docs/design.md | 27 +++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 docs/assets/cpu_modes.png create mode 100644 docs/design.md diff --git a/README.en.md b/README.en.md index f046e30..247c89c 100644 --- a/README.en.md +++ b/README.en.md @@ -1,10 +1,12 @@ # capsule #### Description -Capsule is a next generation Hypervisor which is compatible with VM/container/partition ecosystem and naturally supports hot upgrade capabilities. Based on Rust programming language of memory security, Capsule supports both Type-1 and Type-2 types across various IT/OT/CT scenarios. + +Capsule is a new hypervisor fully controlled by the openEuler community. Like KVM hypervisor, the Capsule hypervisor empowers the virtualization extensions in different CPU implementations. Rust programming language is chosen to re-invent the hypervisor for security. Moreover, Capsule can support common virtual machines (for diverse business applications), micro-VMs (for container workloads), and logical partitions (for realtime applications) at the same time. #### Software Architecture -Software architecture description + +The design keys can be referenced [here](/docs/design.md). #### Installation diff --git a/README.md b/README.md index e263734..7b2434f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # capsule #### 介绍 -Capsule is a next generation Hypervisor which is compatible with VM/container/partition ecosystem and naturally supports hot upgrade capabilities. Based on Rust programming language of memory security, Capsule supports both Type-1 and Type-2 types across various IT/OT/CT scenarios. + +Capsule是完全由openEuler社区控制的新型hypervisor项目。类似KVM,Capsule充分使能不同CPU体系的硬件辅助虚拟化能力。不同的是,Capsule采用Rust语言编写以带来更大的安全性。另外,Capsule重塑了hypervisor架构,使它既可以支持普通虚拟机(满足多种多样的企业应用),也可以支持安全容器(满足容器化负载应用),同时还可以支持逻辑分区(满足实时场景需求)。 #### 软件架构 -软件架构说明 + +软件关键设计思路参考: [设计文档](/docs/design.md)。 #### 安装教程 @@ -27,7 +29,7 @@ Capsule is a next generation Hypervisor which is compatible with VM/container/pa 4. 新建 Pull Request -#### 特技 +#### 特性 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) diff --git a/docs/assets/cpu_modes.png b/docs/assets/cpu_modes.png new file mode 100644 index 0000000000000000000000000000000000000000..a89de5697c86b6f768bf605048ca35da4f80ada1 GIT binary patch literal 47768 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 KrF2DOum20aCT~vw literal 0 HcmV?d00001 diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 0000000..96c2db6 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,27 @@ +This document contains information about the designing of the Capsule hypervisor. + +# Functionality + +## Virtual Machines + +Supporting Virtual Machines is the basic function for the Capsule hypervisor. A virtual machine contains CPUs, Memory, IO Devices, IO Bus, and other System components just like a real computer. + +### CPU + +CPU is the central part of a VM. With the hardware assistant virtualization technology (Intel VT-x, for example), instructions inside the VM can run on the physical hardware directly to improve the execution performance. Therefore, the physical CPU needs to have different modes for the Host Machine and Guest Machines. Intel CPUs which support VT-X, use Root Mode for execution of software in Host Machine and Non-Root Mode for execution of software in Guest Machine. ARM CPUs have EL2 for Host and EL0/EL1 for Guest. Although different CPU architectures have different implementations for the hardware assistant virtualization, the basic process is common, which can be depicted as follows: + +
+ +
+ +Most common instructions can be executed in the Guest Mode directly, while some priviledge instructions need to be emulated in the Host Mode with the Capsule hypervisor. Codes for emulations are CPU implementation relative and need to be analyzed case by case accoring to the hardware specifications. + +#### X86 + +#### ARM + +# Performance + +# Security + +# Reliablility -- Gitee