diff --git a/README.rst b/README.rst index 34bfc5d58bd5682bfea944f472844adb2d824cb7..31e78789e982de690393658266a138658643abc6 100644 --- a/README.rst +++ b/README.rst @@ -19,9 +19,10 @@ ZVM使用 是一种参考Kernel-based Virtual Machine(KVM)实现的虚拟机,其面向高性能嵌入式计算环境, 提供嵌入式平台上操作系统级别的资源隔离和共享服务。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/zvm_demo.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/zvm_demo.png :alt: zvm_demo + zvm_demo @@ -43,35 +44,35 @@ Zephyr系统整体结构和Linux类似,本项目参考基于内核的虚拟机 具体内容及简介: ^^^^^^^^^^^ -`系统简介: `__ +`系统简介: `__ ***************************************************************************************************** ZVM的整个系统各个模块的整体架构介绍,以及一些其他的功能介绍。 -`主机开发环境搭建: `__ +`主机开发环境搭建: `__ **************************************************************************************************************************** Linux主机开发环境的配置,zephyrproject SDK的配置及zvm仓库的初始化和简单sample的构建与测试等。 -`核心模块介绍: `__ +`核心模块介绍: `__ ******************************************************************************************************** 各个模块的详细实现介绍,包括虚拟处理器、虚拟内存、虚拟设备等各个模块的技术实现。 -`ZVM系统构建: `__ +`ZVM系统构建: `__ ******************************************************************************************************** ZVM主机的构建、Linux和zephyr虚拟机的构建以及其他ZVM运行所需要环境的配置流程。 -`ZVM运行与调试: `__ +`ZVM运行与调试: `__ ******************************************************************************************************** 说明如何在主机中运行及调试相应的模块,包括基础指令的测试,以及如何对系统进行调试的步骤。 -`拓展技术介绍: `__ +`拓展技术介绍: `__ ******************************************************************************************************* 为了优化ZVM在嵌入式系统中的运行支持,我们拟支持一些额外的技术,保证ZVM系统能更好的支持各类应用场景。 -`ZVM后续规划: `__ +`ZVM后续规划: `__ ************************************************************************************************** 我们对ZVM的后续发展制定了一些计划安排,你可以在这里找到。 -`加入我们: `__ +`加入我们: `__ ************************************************************************************************ 最后,我们介绍了我们团队的一些成员、如何加入ZVM进行开发以及开发过程中需要遵循的一些基本编码规则。 diff --git a/zvm_doc/1_System_Overview.rst b/zvm_doc/1_System_Overview.rst index 12aac21a471104632285fae88045664368fd11c5..8e82153dd755411addd3b016d65d3bcb53ab2f3e 100644 --- a/zvm_doc/1_System_Overview.rst +++ b/zvm_doc/1_System_Overview.rst @@ -5,10 +5,11 @@ ZVM是基于实时操作系统Zephyr设计的虚拟机管理器(Hypervisor) 内存虚拟化、中断虚拟化、时钟虚拟化及I/O虚拟化等功能。 同时,现阶段Hypervisor支持两个VM,分别是Linux VM和Zephyr VM。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/overview.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/overview.png :alt: Overview + 基础模块 ------------ @@ -51,4 +52,4 @@ ARM 专门为 stage-2 翻译提供单独的硬件,以提高地址翻译性能 实现I/O虚拟化。此外,对一些非独占设备,我们使用设备直通的方式实现设备的访问。 -`Next>> 主机开发环境搭建 `__ +`Next>> 主机开发环境搭建 `__ diff --git a/zvm_doc/2_Environment_Configuration.rst b/zvm_doc/2_Environment_Configuration.rst index 2773ce2bc60c4548e3020a9d38cca866992d5f20..328e60d4c1ba46a2d9782eaaf80e974d4d199421 100644 --- a/zvm_doc/2_Environment_Configuration.rst +++ b/zvm_doc/2_Environment_Configuration.rst @@ -119,9 +119,9 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w 显示有west信息后,即说明工作仓初始化成功,可以进行主机操作系统和客户机操作系统的开发。 -`Prev>> 系统简介 `__ +`Prev>> 系统简介 `__ -`Next>> 核心模块介绍 `__ +`Next>> 核心模块介绍 `__ diff --git a/zvm_doc/3_Key_Modules.rst b/zvm_doc/3_Key_Modules.rst index 12668bfd71886eaf82b0c375b38a6233168abf8f..1c7ae87dbc19a4d6ba9e9dd7da4cd5869d7aefa1 100644 --- a/zvm_doc/3_Key_Modules.rst +++ b/zvm_doc/3_Key_Modules.rst @@ -31,7 +31,7 @@ CPU虚拟化模块主要功能在于为每个虚拟机虚拟出单独隔离的 而在上下文切换过程中,通过错误码判断处理机制,sync处理过程和irq分开,加快处理速度,保证虚拟机的切换性能, 整体vCPU模拟执行逻辑如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vcpu_logic.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vcpu_logic.png 此外,为了更好的减少系统性能开销,我们利用arm VHE技术来减少主机操作系统与客户机操作系统之间的上下文切换次数。 @@ -41,7 +41,7 @@ CPU虚拟化模块主要功能在于为每个虚拟机虚拟出单独隔离的 以减少了虚拟机切换的性能开销,VHE上下文切换如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vhe_context_switch.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vhe_context_switch.png 2.内存虚拟化模块 ^^^^^^^^^^^^^^^^^^^^^^ @@ -56,13 +56,13 @@ ARM提供了两阶段的地址查找策略, (2)到第2阶段从VM的客户机物理地址到主机物理地址的转换,具体内存地址虚拟化逻辑如下图所示, 虚拟机的地址空间由相应的数据结构实现,并在VM初始化过程中初始化其地址空间,以支持VM的内存访问。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vmem_logic.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vmem_logic.png 为了实现这一功能,ARM专门为第2阶段的转换提供了单独的硬件,以提高地址转换的性能。同时,考虑实时系统的时间开销。 ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理地址空间,一整块映射到设备的物理地址空间, 如图下图所示,而不需要考虑Hypervisor级别的页错误,以达到接近物理机器的地址转换开销。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vmem_mapping.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vmem_mapping.png 3.中断虚拟化模块 ^^^^^^^^^^^^^^^^^^^^^^ @@ -73,13 +73,13 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 首先,系统将初始化vGIC相关的数据结构,并注册相应的虚拟中断处理逻辑,并在内存空间分配一块地址来实现对中断控制器的模拟, 以此为VM提供虚拟中断服务。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/virq_logic.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virq_logic.png 此外,在ZVM系统中,在中断触发逻辑中,我们通过配置相关寄存器,统一将VM的中断路由到Hypervisor, 并由其分配给不同的vCPU。而在虚拟中断触发方式上,我们具体是通过GIC中的Virtual CPU interface和List Register来实现虚拟中断的注入。 如下图所示,这一逻辑部分可由硬件接管,以减少软件仿真的开销,进而提高虚拟中断的性能。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/virq_routing.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virq_routing.png 4.时钟虚拟化模块 @@ -94,7 +94,7 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 并补偿虚拟机退出的时间,进而校准vCPU时钟偏差,同时将时钟触发事件转移的主机物理时钟寄存器中, 以支持为虚拟机提供定时器服务,具体如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vtimer_logic.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vtimer_logic.png 5.设备虚拟化模块 @@ -104,12 +104,12 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 具体实现上,我们通过构建Virtual MMIO Device设备及全虚拟化的方式,并在创建VM的过程中将设备分配给指定的VM, 以实现I/O的虚拟化,如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vdev_logic.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vdev_logic.png ZVM系统现阶段具体支持了两类设备,如下图所示,对于主机独占设备,通过完全虚拟化的方式模拟,而其他设备, 支持采用透传直通的方式,以减少开销。此外,我们还将支持virtIO半虚拟化方式,具体在后续章节介绍。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vdev_mode.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vdev_mode.png (1)完全虚拟化的设备(如GIC设备)。 @@ -147,7 +147,7 @@ ZVM系统现阶段具体支持了两类设备,如下图所示,对于主机 来下达控制命令,而serial1通过分配给VM来打印VM的信息, 同时serial1必须支持在虚拟机之间进行切换。直通串口支持shell的方式如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vuart_passthrough.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vuart_passthrough.png 7.vCPU分配及调度策略 ^^^^^^^^^^^^^^^^^^^^^^ @@ -161,7 +161,7 @@ Zephyr采用的是基于可变优先级的可抢占式调度算法,并支持 一个任务所分配的时间片用完后,就进行任务切换,停止当前运行的任务,将它放入就绪列表最高优先级任务链表末尾, 并开始执行就绪队列中的下一个任务。具体使用的轮转调度算法如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/time_stamp.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/time_stamp.png 同时,为了减少系主机和从机的系统切换开销,ZVM在此阶段设计采用主从核设计模式,在设计过 程中将vCPU线程和主机线程尽量绑定在不同的物理处理器上,并通过核间中断(Inter-Processor Interrupt, IPI) @@ -171,12 +171,12 @@ Zephyr采用的是基于可变优先级的可抢占式调度算法,并支持 cpu0与cpuN间的IPI通信通过方式实现,cpu0通过IPI通知cpuN执行任务。vCPU线程在初始化过程中绑定一个物理CPU, 并在启动时部署到指定cpu上执行,直到异常发生。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/vcpu_allocate.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vcpu_allocate.png -`Prev>> 主机开发环境搭建 `__ +`Prev>> 主机开发环境搭建 `__ -`Next>> ZVM系统构建 `__ +`Next>> ZVM系统构建 `__ diff --git a/zvm_doc/4_System_Build.rst b/zvm_doc/4_System_Build.rst index 25de5ef3784783885e8fdfd4d84a8686031a1b6c..4d78c32137e0459c0f6a735671366822b2f3343b 100644 --- a/zvm_doc/4_System_Build.rst +++ b/zvm_doc/4_System_Build.rst @@ -1,5 +1,5 @@ -ZVM系统构建 -================ +构建主机ZVM镜像 +--------------------- QEMU platform @@ -86,23 +86,24 @@ Building Zephyr OS 构建zephyr vm镜像(qemu): +++++++++++++++++++++++++++++ -Supported board: fvp_base_revc_2xaemv8a +Supported board: qemu_cortex_a53 .. code:: shell - west build -b fvp_base_revc_2xaemv8a samples/subsys/shell/shell_module/ \ - -DARMFVP_BL1_FILE=/home/xiong/trusted-firmware-a/build/fvp/release/bl1.bin \ - -DARMFVP_FIP_FILE=/home/xiong/trusted-firmware-a/build/fvp/release/fip.bin + west build -b qemu_cortex_a53 samples/subsys/shell/shell_module/ + 构建zephyr vm镜像(fvp): ++++++++++++++++++++++++++++++++++ -Supported board: qemu_cortex_a53 +Supported board: fvp_base_revc_2xaemv8a .. code:: shell - west build -b qemu_cortex_a53 samples/subsys/shell/shell_module/ + west build -b fvp_base_revc_2xaemv8a samples/subsys/shell/shell_module/ \ + -DARMFVP_BL1_FILE=/home/xiong/trusted-firmware-a/build/fvp/release/bl1.bin \ + -DARMFVP_FIP_FILE=/home/xiong/trusted-firmware-a/build/fvp/release/fip.bin 最终生成如下镜像文件: @@ -151,6 +152,7 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 2) 拉取busybox包 + .. code:: shell # 在busybox官网拉取busybox包 @@ -197,11 +199,9 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 $ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz -3. Build kernel +3. Build kernel. +++++++++++++++++++++++++++++ -这里我们构建可以运行在虚拟机上的Linux内核。 - .. code:: shell # Download Linux-5.16.12 or other version’s kernel. @@ -213,9 +213,8 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image - 构建linux vm镜像(fvp): -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Download Linux-5.16.12 or other version’s kernel. ++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -258,7 +257,6 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 autoreconf -i ./configure --enable-psci --enable-gicv3 --with-kernel-dir=path-to/linux-5.16.12/ --with-dtb=path-to/fvp-base-gicv3-psci.dtb --with-initrd=path-to/initramfs.cpio.gz --host=aarch64-linux-gnu make - # And the final generated image file: linux-system.axf @@ -284,8 +282,3 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 [1] https://docs.zephyrproject.org/latest/index.html [2] https://gitee.com/cocoeoli/arm-trusted-firmware-a - -`Prev>> 核心模块介绍 `__ - -`Next>> ZVM运行与调试 `__ - diff --git a/zvm_doc/5_Running_and_Debugging.rst b/zvm_doc/5_Running_and_Debugging.rst index dafb90cbeb661d99e88f1611b96f7f34876e731a..ae3bb5958071556caf12bcc3efa3647771d85d80 100644 --- a/zvm_doc/5_Running_and_Debugging.rst +++ b/zvm_doc/5_Running_and_Debugging.rst @@ -169,9 +169,9 @@ ZVM中虚拟机的状态有以下几种: zvm delete -n 1 # delete the vm with vm\'s vmid equal to 1 -`Prev>> ZVM系统构建 `__ +`Prev>> ZVM系统构建 `__ -`Next>> 拓展技术介绍 `__ +`Next>> 拓展技术介绍 `__ 问题反馈 diff --git a/zvm_doc/6_Expansion_Technology.rst b/zvm_doc/6_Expansion_Technology.rst index 5831534726a6103d2d498819b2e9b8fd044cda8b..8653a1b4d77772cca6907d640d8777195ea06527 100644 --- a/zvm_doc/6_Expansion_Technology.rst +++ b/zvm_doc/6_Expansion_Technology.rst @@ -11,7 +11,7 @@ ZVM 提供了两阶段的内存映射,第一阶段是从zephyr的内核空间 第二阶段是虚拟机的物理地址映射到zephyr的物理地址空间。第一阶段的映射主要是把对应内核镜像映射到zephyr物理地址空间中, 第二阶段的映射是使用vm_mem_partition 和 vm_mem_block 进行映射,具体如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/mem_opt_arch.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_opt_arch.png (2)动态分配内存 @@ -22,7 +22,7 @@ ZVM 提供了 CONFIG_VM_DYNAMIC_MEMORY 这一个宏可以让用户自由的选 否则将使用vm_mem_block记录内存的映射。在vm_mem_partion 中维护一条关于block的双向链表, block的大小和映射范围可以动态的变化,这样就实现了内存的动态分配。基于双向链表的静态内存记录如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/mem_opt_list.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_opt_list.png (3)压缩分区 @@ -34,7 +34,7 @@ block的大小和映射范围可以动态的变化,这样就实现了内存的 缺点是压缩率不是很高,符合ZVM的使用场景。内存压缩方案概览图如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/mem_compress.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_compress.png 2.virtIO虚拟化方案 @@ -63,7 +63,7 @@ block的大小和映射范围可以动态的变化,这样就实现了内存的 virtio-queue是一种数据结构,其位于主机和虚拟机都能访问的共享内存中, 其是前端驱动程序和后端虚拟设备消息传输的通道,对I/O请求和I/O响应的操作满足生产者-消费者模型。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/virtIO_arch.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_arch.png (2)virtio-queue设计 @@ -75,7 +75,7 @@ virtio-driver和virtio-device通过virtio-queue进行数据交流, 而VMM中的virtio-device从相应设备的virtio-queue中读取并处理I/O请求, 并将响应信息写回到相应的virtio-queue中。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/virtIO_queue.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_queue.png (3)virtio-driver设计 @@ -90,7 +90,7 @@ ioprio成员用于指示该缓冲区中保存的I/O请求的优先级,值越 缓冲区的最后一个字节是只写的,如果请求成功则写入0,失败则写入1,不支持该请求则写入2。 剩余的缓冲区部分的长度以及类型依据于请求的类型而定。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/refactor/zvm_doc/figure/virtIO_driver.png +.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_driver.png (4)virtio-device设计 @@ -101,8 +101,8 @@ ioprio成员用于指示该缓冲区中保存的I/O请求的优先级,值越 -`Prev>> ZVM运行与调试 `__ +`Prev>> ZVM运行与调试 `__ -`Next>> ZVM后续规划 `__ +`Next>> ZVM后续规划 `__ diff --git a/zvm_doc/7_Todo_List.rst b/zvm_doc/7_Todo_List.rst index 8bb2ddeed97f4addd47383a3e6befd70e27a7d6a..24aac76b75667e3d209682aa4d8c8d9012c52fed 100644 --- a/zvm_doc/7_Todo_List.rst +++ b/zvm_doc/7_Todo_List.rst @@ -13,6 +13,6 @@ -`Prev>> 拓展技术介绍 `__ +`Prev>> 拓展技术介绍 `__ -`Next>> 加入我们 `__ +`Next>> 加入我们 `__ diff --git a/zvm_doc/8_Join_us.rst b/zvm_doc/8_Join_us.rst index 4184632ca00f675b51b7199be7be11288bdbb518..92c861bc50d902858d003a458def7e30310bed7f 100644 --- a/zvm_doc/8_Join_us.rst +++ b/zvm_doc/8_Join_us.rst @@ -36,4 +36,4 @@ -`Prev>> ZVM后续规划 `__ +`Prev>> ZVM后续规划 `__