diff --git a/README.rst b/README.rst index cdf0b6ad4f66c65a7795c2325cf5c5cd9f113689..b6a1546c8ea33a2dffd88f7e2cb3e32c9358eac8 100644 --- a/README.rst +++ b/README.rst @@ -10,7 +10,7 @@ ZVM 开源文档 ZVM使用 `zephyrproject-rtos `__ 所遵守的 `Apache 2.0 许可证 `__ -,主要开发语言为C(C++)语言。 +,主要开发语言为C/C++语言。 介绍:什么是ZVM @@ -19,17 +19,14 @@ ZVM使用 是一款实时虚拟机,其面向高性能嵌入式计算环境,提供嵌入式平台上操作系统级别的资源隔离和共享服务。 .. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/zvm_demo.png + :align: center :alt: zvm_demo - zvm_demo - - -本项目以Zephyr实时操作系统为基础,使用C(C++)在Zephyr RTOS中实现一个面向嵌入式平台的虚拟机管理器。 -Zephyr RTOS是一个小型的实时操作系统,用于连接、资源受限和嵌入式设备,支持多种架构,发布于Apache License 2.0下。 -Zephyr包括内核、所有组件和库、设备驱动程序、协议栈、文件系统和固件更新,以开发连接、资源受限和嵌入式设备。 -Zephyr RTOS易于部署、安全、连接和管理。它具有不断增长的软件库集,可用于各种应用和行业领域, -如工业物联网、可穿戴设备、机器学习等。 +本项目以Zephyr实时操作系统为基础,使用C/C++在Zephyr RTOS中实现一个面向嵌入式平台的虚拟机管理器。 +Zephyr RTOS是一个小型的实时操作系统,用于连接、资源受限和嵌入式设备,支持多种架构。 +Zephyr包括内核、所有组件和库、设备驱动程序、协议栈、文件系统和固件更新,以开发连接、资源受限和嵌入式设备, +可用于各种应用和行业领域,如工业物联网、可穿戴设备、机器学习等。 文档目录 ------------------ @@ -37,39 +34,29 @@ Zephyr RTOS易于部署、安全、连接和管理。它具有不断增长的软 下面目录中内容包含ZVM系统介绍及系统的使用说明。 具体内容及简介: -^^^^^^^^^^^ +^^^^^^^^^^^^^^ -`1.系统简介: `__ +`1.系统介绍: `__ ***************************************************************************************************** ZVM的整个系统各个模块的整体架构介绍,以及一些其他的功能介绍。 `2.主机开发环境搭建: `__ -**************************************************************************************************************************** -Linux主机开发环境的配置,zephyrproject SDK的配置及zvm仓库的初始化和简单sample的构建与测试等。 +*************************************************************************************************************** +Linux/Ubuntu主机开发环境的配置,zephyrproject SDK的配置及zvm仓库的初始化和简单sample的构建与测试等。 -`3.核心模块介绍: `__ +`3.在QEMU上运行ZVM: `__ ******************************************************************************************************** -各个模块的详细实现介绍,包括虚拟处理器、虚拟内存、虚拟设备等各个模块的技术实现。 +在QEMU ARM64上面运行ZVM的教程。 -`4.ZVM系统构建: `__ +`4.在RK3568上运行ZVM `__ ******************************************************************************************************** -ZVM主机的构建、Linux和zephyr虚拟机的构建以及其他ZVM运行所需要环境的配置流程。 +在ROC_RK3568_PC上面运行ZVM的教程。 -`5.ZVM运行与调试: `__ +`5.加入我们: `__ ******************************************************************************************************** -说明如何在主机中运行及调试相应的模块,包括基础指令的测试,以及如何对系统进行调试的步骤。 - -`6.拓展技术介绍: `__ -******************************************************************************************************* -为了优化ZVM在嵌入式系统中的运行支持,我们拟支持一些额外的技术,保证ZVM系统能更好的支持各类应用场景。 - -`7.ZVM后续规划: `__ -************************************************************************************************** -我们对ZVM的后续发展制定了一些计划安排,你可以在这里找到。 - -`8.加入我们: `__ -************************************************************************************************ 最后,我们介绍了我们团队的一些成员、如何加入ZVM进行开发以及开发过程中需要遵循的一些基本编码规则。 +以及ZVM的后续发展制定了一些计划安排,你可以在这里找到。 + 视频介绍 diff --git a/zvm_doc/3_Key_Modules.rst b/zvm_doc/1_System_Design.rst similarity index 49% rename from zvm_doc/3_Key_Modules.rst rename to zvm_doc/1_System_Design.rst index 2cb3fc89bafcab8a3e46c66d631ef65a78e29ee5..d2e74bc91aa77b0dd64615cc112f7ceeec84f5af 100644 --- a/zvm_doc/3_Key_Modules.rst +++ b/zvm_doc/1_System_Design.rst @@ -1,12 +1,56 @@ -核心模块设计 +ZVM 总体设计介绍 ================ -ZVM是基于实时操作系统Zephyr设计的虚拟机管理器(Hypervisor),系统架构如下图所示, -主要功能模块包括包括CPU虚拟化、内存虚拟化、中断虚拟化、时钟虚拟化及I/O虚拟化等功能。 -本文档介绍各个核心功能模块的实现。 +ZVM是基于实时操作系统Zephyr的虚拟机管理器(Hypervisor),系统架构如下图所示,主要功能模块包括包括CPU虚拟化、 +内存虚拟化、中断虚拟化、时钟虚拟化及I/O虚拟化等功能。 +同时,现阶段Hypervisor支持Linux VM和Zephyr VM。 +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/overview.png + :alt: Overview + :align: center -核心功能模块 + +基础模块简介 +--------------------- + +处理器虚拟化 +^^^^^^^^^^^^^^^^^^^^^^ + +CPU 虚拟化模块为每个 VM 的 vCPU 实现一个单独的上下文。每个vCPU都是作为一个线程存在的, +由Hypervisor统一调度。为了提高vCPU的性能,VHE可以使ZVM在不修改OS内核代码的情况下, +将Zephyr OS迁移到EL2层充当Hypervisor,既降低了系统冗余,又提高了系统性能。 + +内存虚拟化模块 +^^^^^^^^^^^^^^^^^^^^^^ + +内存虚拟化模块的主要作用是实现VM内存地址的隔离。监控VM对实际物理内存的访问,以保护物理内存。 +ZMV使用了两阶段的地址查找策略,ARM为stage-2翻译提供单独的硬件,以提高地址翻译性能。 +第一阶段是从VM的虚拟地址到VM的物理地址的转换,第二阶段是从VM的物理地址到主机的物理地址。 + + +中断虚拟化模块 +^^^^^^^^^^^^^^^^^^^^^^ + +中断虚拟化使用ARM通用中断控制器(GIC),并基于该设备实现虚拟中断配置。 +ZVM将 VM 的中断统一路由到 Hypervisor层,Hypervisor 会将它们分配给不同的 vCPU。 +具体实现上,虚拟中断的注入是通过GIC中的Virtual CPU接口或List Register实现的。 + +定时器虚拟化 +^^^^^^^^^^^^^^^^^^^^^^ + +定时器虚拟化为每个 CPU 定义了一组虚拟定时器寄存器,它们在预定时间后单独计数并抛出中断, +由主机转发给 VM。 在VM切换过程中,虚拟定时器会计算VM的实际运行时间, +并对虚拟机退出的时间进行补偿,为虚拟机提供定时器服务。 + +设备虚拟化 +^^^^^^^^^^^^^^^^^^^^^^ + +在设备虚拟化方面,ZVM采用了Memory-mapped I/O(MMIO)方法将设备地址映射到虚拟的内存地址,构建虚拟的设备空间, +实现VN对设备地址的访问。 ZVM在VM创建过程中将该设备分配给指定的VM,实现I/O虚拟化。 +此外,对一些非独占设备,我们使用设备直通的方式实现设备的访问。 + + +核心功能模块介绍 --------------- 1.处理器虚拟化模块 @@ -31,7 +75,8 @@ CPU虚拟化模块主要功能在于为每个虚拟机虚拟出单独隔离的 而在上下文切换过程中,通过错误码判断处理机制,sync处理过程和irq分开,加快处理速度,保证虚拟机的切换性能, 整体vCPU模拟执行逻辑如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vcpu_logic.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vcpu_logic.png + :align: center 此外,为了更好的减少系统性能开销,我们利用arm VHE技术来减少主机操作系统与客户机操作系统之间的上下文切换次数。 @@ -41,7 +86,8 @@ CPU虚拟化模块主要功能在于为每个虚拟机虚拟出单独隔离的 以减少了虚拟机切换的性能开销,VHE上下文切换如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vhe_context_switch.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vhe_context_switch.png + :align: center 2.内存虚拟化模块 ^^^^^^^^^^^^^^^^^^^^^^ @@ -56,13 +102,15 @@ ARM提供了两阶段的地址查找策略, (2)到第2阶段从VM的客户机物理地址到主机物理地址的转换,具体内存地址虚拟化逻辑如下图所示, 虚拟机的地址空间由相应的数据结构实现,并在VM初始化过程中初始化其地址空间,以支持VM的内存访问。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vmem_logic.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vmem_logic.png + :align: center 为了实现这一功能,ARM专门为第2阶段的转换提供了单独的硬件,以提高地址转换的性能。同时,考虑实时系统的时间开销。 ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理地址空间,一整块映射到设备的物理地址空间, 如图下图所示,而不需要考虑Hypervisor级别的页错误,以达到接近物理机器的地址转换开销。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vmem_mapping.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vmem_mapping.png + :align: center 3.中断虚拟化模块 ^^^^^^^^^^^^^^^^^^^^^^ @@ -73,14 +121,15 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 首先,系统将初始化vGIC相关的数据结构,并注册相应的虚拟中断处理逻辑,并在内存空间分配一块地址来实现对中断控制器的模拟, 以此为VM提供虚拟中断服务。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virq_logic.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/virq_logic.png + :align: center 此外,在ZVM系统中,在中断触发逻辑中,我们通过配置相关寄存器,统一将VM的中断路由到Hypervisor, 并由其分配给不同的vCPU。而在虚拟中断触发方式上,我们具体是通过GIC中的Virtual CPU interface和List Register来实现虚拟中断的注入。 如下图所示,这一逻辑部分可由硬件接管,以减少软件仿真的开销,进而提高虚拟中断的性能。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virq_routing.png - +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/virq_routing.png + :align: center 4.时钟虚拟化模块 ^^^^^^^^^^^^^^^^^^^^^^ @@ -94,7 +143,8 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 并补偿虚拟机退出的时间,进而校准vCPU时钟偏差,同时将时钟触发事件转移的主机物理时钟寄存器中, 以支持为虚拟机提供定时器服务,具体如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vtimer_logic.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vtimer_logic.png + :align: center 5.设备虚拟化模块 @@ -104,12 +154,14 @@ ZVM先接单采用的线性映射的逻辑,即将虚拟机所需要的物理 具体实现上,我们通过构建Virtual MMIO Device设备及全虚拟化的方式,并在创建VM的过程中将设备分配给指定的VM, 以实现I/O的虚拟化,如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vdev_logic.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vdev_logic.png + :align: center ZVM系统现阶段具体支持了两类设备,如下图所示,对于主机独占设备,通过完全虚拟化的方式模拟,而其他设备, 支持采用透传直通的方式,以减少开销。此外,我们还将支持virtIO半虚拟化方式,具体在后续章节介绍。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vdev_mode.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vdev_mode.png + :align: center (1)完全虚拟化的设备(如GIC设备)。 @@ -147,7 +199,8 @@ ZVM系统现阶段具体支持了两类设备,如下图所示,对于主机 来下达控制命令,而serial1通过分配给VM来打印VM的信息, 同时serial1必须支持在虚拟机之间进行切换。直通串口支持shell的方式如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vuart_passthrough.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/vuart_passthrough.png + :align: center 7.vCPU分配及调度策略 ^^^^^^^^^^^^^^^^^^^^^^ @@ -161,7 +214,8 @@ Zephyr采用的是基于可变优先级的可抢占式调度算法,并支持 一个任务所分配的时间片用完后,就进行任务切换,停止当前运行的任务,将它放入就绪列表最高优先级任务链表末尾, 并开始执行就绪队列中的下一个任务。具体使用的轮转调度算法如下图所示。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/time_stamp.png +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/time_stamp.png + :align: center 同时,为了减少系主机和从机的系统切换开销,ZVM在此阶段设计采用主从核设计模式,在设计过 程中将vCPU线程和主机线程尽量绑定在不同的物理处理器上,并通过核间中断(Inter-Processor Interrupt, IPI) @@ -171,12 +225,104 @@ Zephyr采用的是基于可变优先级的可抢占式调度算法,并支持 cpu0与cpuN间的IPI通信通过方式实现,cpu0通过IPI通知cpuN执行任务。vCPU线程在初始化过程中绑定一个物理CPU, 并在启动时部署到指定cpu上执行,直到异常发生。 -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/vcpu_allocate.png +8.内存设计优化方案 +^^^^^^^^^^^^^^^^^^^^^^ + +(1)整体架构 +~~~~~~~~~~~~~~~~ + +ZVM 提供了两阶段的内存映射,第一阶段是从zephyr的内核空间映射到物理内存地址, +第二阶段是虚拟机的物理地址映射到zephyr的物理地址空间。第一阶段的映射主要是把对应内核镜像映射到zephyr物理地址空间中, +第二阶段的映射是使用vm_mem_partition 和 vm_mem_block 进行映射,具体如下图所示。 -`Prev>> 主机开发环境搭建 `__ +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/mem_opt_arch.png + :align: center -`Next>> ZVM系统构建: `__ +(2)动态分配内存 +~~~~~~~~~~~~~~~~ +ZVM 提供了 CONFIG_VM_DYNAMIC_MEMORY 这一个宏可以让用户自由的选择是否动态分配内存, +如果选择静态的内存分配,每一个虚拟机都将得到一个vm_mem_partition 记录整体的内存分配状态, +否则将使用vm_mem_block记录内存的映射。在vm_mem_partion 中维护一条关于block的双向链表, +block的大小和映射范围可以动态的变化,这样就实现了内存的动态分配。基于双向链表的静态内存记录如下图所示。 +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/mem_opt_list.png + :align: center + +(3)压缩分区 +~~~~~~~~~~~~~~~~ + +为了减少嵌入式系统的内存损耗,我们拟在ZVM 在内存初始化的过程中从 zephyr +的heap中分配了一块压缩分区,当内存紧张的时候,将会把一部分不常用的block压缩至压缩分区中, +之后如果有请求再把它从压缩分区中恢复。我们采用 LZO 算法进行无损压缩,LZO 具有较高的压缩速度和较低的内存需求, +缺点是压缩率不是很高,符合ZVM的使用场景。内存压缩方案概览图如下图所示。 + + +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/mem_compress.png + :align: center + + +9.virtIO虚拟化方案 +^^^^^^^^^^^^^^^^^^^^^^ +(1)整体架构 +~~~~~~~~~~~~~~~~ + +在虚拟化系统中,I/O资源是有限的,为了满足多个Guest OS的需求,VMM必须通过I/O虚拟化的方式来复用有限的I/O资源。 +现有的I/O虚拟化方案可以分为三类:全虚拟化、半虚拟化和 I/O 透传。 +其中全虚拟化方案就是通过纯软件的形式来模拟I/O设备并处理虚拟机的 I/O 请求, +虽然因为无需对操作系统做修改而获得了较好的可移植性和兼容性,但大量的上下文切换也造成了巨大的性能开销。 +半虚拟化是一种软硬件结合的方式,它提供了一种机制,用于接收并转发Guest端的I/O请求到Host端, +最终由主机的硬件处理这些I/O请求,同时也可以接收并转发Host端的I/O响应到Guest端。这样既能够有序的处理I/O请求, +又能够减少性能开销。I/O透传技术让虚拟机独占一个物理设备,并像宿主机一样的使用物理设备, +因此其需要依赖虚拟内存技术,以实现不同虚拟机之间内存空间的隔离。 +基于ZVM的嵌入式应用场景以及Zephyr操作系统的实时性要求,本方案选用半虚拟化的I/O虚拟化方案, +以Linux系统中的VirtI/O框架作为设计参考。 + +整体虚拟化架构如图所示,共分为三个部分:前端的驱动程序virtio-driver, +后端的虚拟设备virtio-device以及用于连接二者的virtio-queue。 +前端的virtio-driver以内核模块的形式存在于Guest OS中,其核心职责是: 接收来自用户进程的I/O请求, +将这些 I/O 请求转移到相应的后端虚拟设备中,并从virtio-device中接收已经处理完的I/O响应数据。 +后端的virtio-device存在于ZVM中,ZVM以内核模块的形式载入主机操作系统Zephyr。其核心职责是: +接收来自相应前端virtio驱动程序的I/O请求,使用物理硬件来处理这些I/O请求,并将响应数据暴露给前端驱动程序。 +virtio-queue是一种数据结构,其位于主机和虚拟机都能访问的共享内存中, +其是前端驱动程序和后端虚拟设备消息传输的通道,对I/O请求和I/O响应的操作满足生产者-消费者模型。 + +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/virtIO_arch.png + :align: center + +(2)virtio-queue设计 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +如下图所示,virtio-queue是一组缓冲区块组成的队列,每一个缓冲区块都可以设置为可读或可写。 +virtio-driver和virtio-device通过virtio-queue进行数据交流, +每一个virtio-device绑定了一定数量的virtio-queue。Guest OS中的virtio-driver捕获I/O请求之后, +将I/O请求信息写入一个缓冲区块,并将其添加到相应设备的virtio-queue中。 +而VMM中的virtio-device从相应设备的virtio-queue中读取并处理I/O请求, +并将响应信息写回到相应的virtio-queue中。 + +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/virtIO_queue.png + :align: center + +(3)virtio-driver设计 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +不同的外设需要设计不同的驱动程序,具体表现为绑定的virtio-queue数量, +virtio-queue中缓冲区的结构以及对缓冲区的操作不同,本方案暂只对块设备驱动程序的设计方法进行说明。 +块设备只绑定了一个virtio-queue,这个virtio-queue即用于保存I/O请求,也用于保存I/O响应数据。 +virtio-queue中的缓冲区结构如图3(左)所示,在原始的virtio框架中, +每个缓冲区的前16个字节总是一个只读的描述符结构,该描述符结构如图3(右)所示,type成员用于指示该缓冲区是只读、 +只写还是通用的SCSI命令以及在这个命令之前是否应该有一个写障碍。 +ioprio成员用于指示该缓冲区中保存的I/O请求的优先级,值越大则优先级越高。sector成员指示磁盘操作的偏移量。 +缓冲区的最后一个字节是只写的,如果请求成功则写入0,失败则写入1,不支持该请求则写入2。 +剩余的缓冲区部分的长度以及类型依据于请求的类型而定。 + +.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/virtIO_driver.png + :align: center + +(4)virtio-device设计 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +后端的virtio-device主要需要进行的是I/O事件的通知,当从virtio-queue中读取到一个I/O请求时, +虚拟设备需要通知真实的物理设备对I/O请求进行处理,在本方案中,拟设计一个API将I/O请求分发到Host的I/O调度器上, +由Host完成之后的操作。 + +`Next>> 主机开发环境搭建 `__ diff --git a/zvm_doc/1_System_Overview.rst b/zvm_doc/1_System_Overview.rst deleted file mode 100644 index 5fd25fb236b10c274c29157ccc61585dce0fc207..0000000000000000000000000000000000000000 --- a/zvm_doc/1_System_Overview.rst +++ /dev/null @@ -1,55 +0,0 @@ -ZVM 总体设计概览 -================ - -ZVM是基于实时操作系统Zephyr设计的虚拟机管理器(Hypervisor),系统架构如下图所示,主要功能模块包括包括CPU虚拟化、 -内存虚拟化、中断虚拟化、时钟虚拟化及I/O虚拟化等功能。 -同时,现阶段Hypervisor支持两个VM,分别是Linux VM和Zephyr VM。 - -.. figure:: https://gitee.com/openeuler/zvm/raw/master/zvm_doc/figure/overview.png - :alt: Overview - - - -基础模块 ------------- - -处理器虚拟化 -^^^^^^^^^^^^^^^^^^^^^^ - -CPU 虚拟化模块的主要功能是为每个 VM 的 vCPU 虚拟出一个单独的隔离上下文。 -在此系统中,每个vCPU都是作为一个线程存在的,由Hypervisor统一调度。 -为了提高vCPU的性能,ARMv8架构为Hypervisor提供了VHE支持,VHE可以使Host OS迁移到EL2特权模式, -而无需改变操作系统原有的代码。 VHE支持主要实现了ARM寄存器的重定向,这样我们就可以在不修改OS内核代码的情况下, -将Zephyr OS迁移到EL2层充当Hypervisor,既降低了系统冗余,又提高了系统性能。 - -内存虚拟化模块 -^^^^^^^^^^^^^^^^^^^^^^ - -内存虚拟化模块的主要作用是实现VM内存地址的隔离。 系统需要隔离不同虚拟机的内存空间, -监控VM对实际物理内存的访问,以保护物理内存。 为了实现这个功能,ARM提供了两阶段的地址查找策略。 -第一阶段是从VM的虚拟地址到VM的物理地址的转换,第二阶段是从VM的物理地址到主机的物理地址。 -ARM 专门为 stage-2 翻译提供单独的硬件,以提高地址翻译性能。 - -中断虚拟化模块 -^^^^^^^^^^^^^^^^^^^^^^ - -中断虚拟化使用ARM通用中断控制器(GIC)设备,并基于该设备实现虚拟中断配置。 -在此系统中,我们将 VM 的中断统一路由到 Hypervisor,Hypervisor 稍后会将它们分配给不同的 vCPU。 -具体实现上,虚拟中断的注入是通过GIC中的Virtual CPU接口或List Register实现的。 - -定时器虚拟化 -^^^^^^^^^^^^^^^^^^^^^^ - -定时器虚拟化为每个 CPU 定义了一组虚拟定时器寄存器,它们在预定时间后单独计数并抛出中断, -由主机转发给 VM。 同时,在VM切换过程中,虚拟定时器会计算VM的实际运行时间, -并对虚拟机退出的时间进行补偿,为虚拟机提供定时器服务。 - -设备虚拟化 -^^^^^^^^^^^^^^^^^^^^^^ - -在设备虚拟化方面,本文采用ARM中的Memory-mapped I/O(MMIO)方法将设备地址映射到虚拟的内存地址,构建虚拟的设备空间, -实现VN对设备地址的访问。 在具体实现上,我们统一构建一个虚拟的MMIO设备,在VM创建过程中将该设备分配给指定的VM, -实现I/O虚拟化。此外,对一些非独占设备,我们使用设备直通的方式实现设备的访问。 - - -`Next>> 主机开发环境搭建 `__ diff --git a/zvm_doc/2_Environment_Configuration.rst b/zvm_doc/2_Environment_Configuration.rst index b3f4b44c11f0ee79f4a3886e3a0d61079f2ea8fd..f654d919ee0c2ef7926d9edfc141d4b5dbbacc6d 100644 --- a/zvm_doc/2_Environment_Configuration.rst +++ b/zvm_doc/2_Environment_Configuration.rst @@ -1,9 +1,9 @@ 主机开发环境构建 ====================== -注:如果您是首次使用`Zephyr`进行开发,请遵照下面教程在您电脑上先安装`Zephyr`运行环境,并在`Zephyr`使用 -`Zephyr`简易sample进行测试。以避免开发环境本身对zvm运行产生影响。如果使用过Zephyr的就可以直接按照下面教程 -进行zvm环境配置。 +注:如果您是首次使用Zephyr RTOS,请遵照下面教程在您电脑上先安装Zephyr运行环境,并使用 +简易sample进行测试。以避免开发环境本身对ZVM运行产生影响。如果配置过Zephyr环境的就可以 +直接跳转到第7步进行zvm环境配置。 开发环境配置 --------------- @@ -68,7 +68,7 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w cd zephyr-sdk-0.16.1 ./setup.sh -1. 安装west工具 +5. 安装west工具 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (这里选择全局安装,若是想要在python-env中安装,参考[1]中资料) @@ -78,7 +78,7 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc source ~/.bashrc -6. 版本信息核对(请确保安装依赖的版本与文档所示一致) +6. 版本信息核对 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: shell @@ -87,17 +87,17 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w python3 --version dtc --version -7. 创建并初始化工作区 +7. 创建并初始化ZVM工作区 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -(1)创建工作区并拉取zvm仓库镜像 +(1)创建工作区并拉取ZVM仓库镜像 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code:: shell cd ~ mkdir zvm_workspace && cd zvm_workspace - git clone https://gitee.com/cocoeoli/zvm.git + git clone https://gitee.com/openeuler/zvm.git (2)初始化工作仓 @@ -106,9 +106,9 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w .. code:: shell cd zvm - west init -l /path-to/zvm + west init -l $(pwd) -上面的'path-to'修改为自己的目录路径,执行完上面命令后,在'zvm_workspace'目录下将会生成.west文件夹, +执行完上面命令后,在'zvm_workspace'目录下将会生成.west文件夹, 其中'config'文件中存放了west的相关配置。此时可以通过执行如下命令查看'west'配置是否成功: .. code:: shell @@ -125,9 +125,9 @@ west 工具,本项目已经将west.yml文件进行了配置,只需要使用w 显示有west信息后,即说明工作仓初始化成功,可以进行主机操作系统和客户机操作系统的开发。 -`Prev>> 系统简介 `__ +`Prev>> 系统介绍 `__ -`Next>> 核心模块介绍 `__ +`Next>> 在QEMU上运行ZVM `__ diff --git a/zvm_doc/4_System_Build.rst b/zvm_doc/3_Run_on_ARM64_QEMU.rst similarity index 41% rename from zvm_doc/4_System_Build.rst rename to zvm_doc/3_Run_on_ARM64_QEMU.rst index 106827c1c3a8e61fbdf5f6eb18cfb280262b4feb..cc055dbe2ab94812c2e859cf28ad18096987bc46 100644 --- a/zvm_doc/4_System_Build.rst +++ b/zvm_doc/3_Run_on_ARM64_QEMU.rst @@ -1,12 +1,9 @@ -构建主机ZVM镜像 ---------------------- +在ARM QEMU上运行ZVM +====================== -QEMU 平台构建流程 -~~~~~~~~~~~~~~~~~~~~~ - -1. 在ZVM的工作目录下构建ZVM镜像 -+++++++++++++++++++++++++++++++++++++++++++ +1. QEMU 平台构建ZVM镜像 +----------------------- 拉取镜像并进入工作区: @@ -18,7 +15,7 @@ QEMU 平台构建流程 .. code:: shell - ./auto_build.sh build qemu + ./auto_zvm.sh build qemu 或者使用命令行构建镜像: @@ -34,101 +31,69 @@ QEMU 平台构建流程 build/zephyr/zvm_host.elf -Arm FVP 平台构建流程 -~~~~~~~~~~~~~~~~~~ - -1. 在ZVM的工作目录构建ZVM镜像 -++++++++++++++++++++++++++++++ -进入zvm工作目录: - -.. code:: shell +2. QEMU 平台运行ZVM(非定制镜像) +------------------------------- - cd ~/zvm_workspace/zvm - -1) 使用脚本文件构建ZVM镜像: +如果不想自己去定制Linux和Zephyr的镜像文件,本项目提供了直接可以在平台上执行的镜像文件, +可以在使用如下方法拉取已经定制好的镜像: .. code:: shell + cd ../ #返回到zvm_workspace + git clone https://gitee.com/hnu-esnl/zvm_vm_image.git - ./auto_build.sh build fvp - -或者使用命令行构建镜像: +随后将镜像放置代码仓指定位置: .. code:: shell - west build -b fvp_cortex_a55x4_a75x2_smp samples/_zvm \ - -DARMFVP_BL1_FILE=path-to/trusted-firmware-a/build/fvp/release/bl1.bin \ - -DARMFVP_FIP_FILE=path-to/trusted-firmware-a/build/fvp/release/fip.bin + git clone https://gitee.com/hnu-esnl/zvm_vm_image.git + cp -r zvm_vm_image/qemu_max/linux/* zvm/zvm_config/qemu_platform/hub + cp -r zvm_vm_image/qemu_max/zephyr/* zvm/zvm_config/qemu_platform/hub -后面的'arm-trusted-fireware-a'为arm 平台的安全启动工具, - -2)生成ZVM镜像文件如下: +此时,在zvm_config/qemu_platform/hub目录下有Linux和zephyr虚拟机的镜像,直接执行如下命令即可运行: +(注:上述仓库中镜像可以选择下单个或者多个) .. code:: shell - build/zephyr/zvm_host.elf - - + ./auto_zvm.sh debug qemu -构建虚拟机镜像 --------------------------- -因为本项目的zvm系统搭建的是同构虚拟化平台,现阶段实现的虚拟机和主机运行的平台是一致的,因此下面分别介绍针对qemu以及 -fvp平台的os镜像构建过程。 +3. QEMU 平台自定义构建镜像方法 +------------------------------- -Building Zephyr OS +构建 Zephyr VM 镜像 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -在构建Zephyr os的镜像过程中,需要使用zephyrproject的工程,分别生成适用于qemu和fvp版本的虚拟机镜像,镜像构建具体过程如下。 -需要注意的是,本项目中在zephyr vm生成过程中,如果是fvp平台,需要考虑arm trusted-firmware-a的启动配置,arm trusted-firmware-a -相关仓库和配置参考资料[2],直接将代码拉取下来,再编译构建即可。 - - -构建zephyr vm镜像(qemu): -+++++++++++++++++++++++++++++ - +在构建Zephyr的镜像过程中,需要使用zephyrproject的工程。 +首先进入zephyrproject工程并镜像构建具体过程如下。 Supported board: qemu_cortex_a53 .. code:: shell west build -b qemu_cortex_a53 samples/subsys/shell/shell_module/ - - -构建zephyr vm镜像(fvp): -++++++++++++++++++++++++++++++++++ - -Supported board: fvp_base_revc_2xaemv8a - -.. 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 - - 最终生成如下镜像文件: .. code:: shell build/zephyr/zephyr.bin - -Building linux OS +构建 Linux VM 镜像 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 构建linux OS过程中,需要先拉取linux kernel源码,并构建设备树及文件系统, -最终构建linux vm镜像(qemu): +最终构建linux vm镜像: -1. Build dtb. +(1) 生成dtb文件. +++++++++++++++++++++++++++++ + .. code:: shell # build dtb file for linux os, the dts file is locate at ../zvm_config/qemu_platform/linux-qemu-virt.dts dtc linux-qemu-virt.dts -I dts -O dtb > linux-qemu-virt.dtb -2. Build filesystem. -++++++++++++++++++++++++++++++++++++++++++++++++++ +(2) 生成文件系统. ++++++++++++++++++++++++++++++ 构建initramfs根文件系统,这此处借助了BusyBox构建极简initramfs,提供基本的用户态可执行程序编译 BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可执行文件busybox不依赖动态链接库 @@ -198,7 +163,7 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 $ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz -3. Build kernel. +(3) 编译 kernel. +++++++++++++++++++++++++++++ .. code:: shell @@ -211,88 +176,25 @@ BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可 # build kernel make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image - -构建linux vm镜像(fvp): -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Download Linux-5.16.12 or other version’s kernel. -++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -2. Build kernel. -++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. code:: shell - - # chose the debug info, the .config file that is show on ../zvm_config/fvp_platform/.config_fvp - make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig - # build kernel, generate image in: ./zvm_configs/fvp_platform/Image - make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image - -3. Build dtb. -+++++++++++++++++++++++++++++++++++++++++++++++++++ +最终在qemu平台,生成如下文件: .. code:: shell - # build dtb file for linux os, the dts file is locate at ../zvm_config/fdts/* - dtc fdts/fvp-base-gicv3-psci.dts -I dts -O dtb > fvp-base-gicv3-psci.dtb + zephyr.bin, linux-qemu-virt.dtb, Image, initramfs.cpio.gz -4. Build filesystem. -+++++++++++++++++++++++++++++++++++++++++++++++++++++++ +再将其复制到zvm_config/qemu_platform/hub文件夹中,并运行: -.. code:: shell - - # build the filesystem and generate the filesystem image - # Using busybox to build it, ref: https://consen.github.io/2018/01/17/debug-linux-kernel-with-qemu-and-gdb/. - -5. Build linux image. -+++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. code:: shell - - # using boot-wrapper to build linux image. - wget https://git.kernel.org/pub/scm/linux/kernel/git/mark/boot-wrapper-aarch64.git/snapshot/boot-wrapper-aarch64-ed60963595855e66ffc06a8a543cbb429c7ede03.tar.gz - tar -xf boot-wrapper-aarch64-ed60963595855e66ffc06a8a543cbb429c7ede03.tar.gz - cd boot-wrapper-aarch64-ed60963595855e66ffc06a8a543cbb429c7ede03/ - 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 - - -最终生成文件 -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -在qemu平台,成功生成如下文件: -++++++++++++++++++++++++++++++++++++++++++++ -.. code:: shell - - zvm_host.elf, zephyr.bin, linux-qemu-virt.dtb, Image, initramfs.cpio.gz - -在fvp平台,成功生成如下文件: -+++++++++++++++++++++++++++++++++++++++++++++ -.. code:: shell - - zvm_host.elf, zephyr.bin, linux-system.axf(包含内核镜像,文件系统及设备树等文件) - - -自动化构建和运行 ---------------------- - -如果不想自己去构建Linux和Zephyr的相关镜像文件,本项目提供了直接可以在平台上执行的镜像文件, -在`zvm_config/qemu_platform/hub`目录下,直接执行如下命令即可运行: -+++++++++++++++++++++++++++++++++++++++++++++ .. code:: shell ./auto_zvm.sh debug qemu +`Prev>> 主机开发环境搭建 `__ -`Prev>> 核心模块介绍: `__ - -`Next>> ZVM运行与调试: `__ +`Next>> 在RK3568上运行ZVM `__ 参考资料: ---------------------------- +----------- [1] https://docs.zephyrproject.org/latest/index.html [2] https://gitee.com/cocoeoli/arm-trusted-firmware-a diff --git a/zvm_doc/4_Run_on_ROC_RK3568_PC.rst b/zvm_doc/4_Run_on_ROC_RK3568_PC.rst new file mode 100644 index 0000000000000000000000000000000000000000..a40170a8b4a12e11ee06beb89b18ef66ad23386e --- /dev/null +++ b/zvm_doc/4_Run_on_ROC_RK3568_PC.rst @@ -0,0 +1,8 @@ +在ROC_RK3568_PC上运行ZVM +====================== + +@TODO + +`Prev>> 在QEMU上运行ZVM `__ + +`Next>> 加入我们 `__ diff --git a/zvm_doc/8_Join_us.rst b/zvm_doc/5_Join_us.rst similarity index 61% rename from zvm_doc/8_Join_us.rst rename to zvm_doc/5_Join_us.rst index d4965afb4ddfa17c6f67fb9d2b96d48a82e02a2e..efaccd7ed89d285d5a9b55ba741f6dc893a10b53 100644 --- a/zvm_doc/8_Join_us.rst +++ b/zvm_doc/5_Join_us.rst @@ -34,5 +34,19 @@ 温浩,邮箱:769135410@qq.com ****************************************************************** - -`Prev>> ZVM后续规划: `__ +未来规划 +========== + +现阶段计划 +--------- +- [√] 能够在FVP和QEMU模拟平台上运行,能够支持启动至少两个及以上虚拟机(Linux, Zephyr)。 +- [√] 能够在QEMU模拟平台上运行,能够支持启动至少两个及以上虚拟机(Linux, Zephyr)。 +- [√] 能够支持virtIO等设备虚拟化框架。 +- [×] 能够支持虚拟化平台部署在openEuler Embedded平台上。 +- [×] 能够支持虚拟机间的实时通信。 + +问题反馈 +-------- +欢迎大家反馈开发中遇到的问题,可以联系上面邮箱。 + +`Prev>> 在RK3568上运行ZVM `__ diff --git a/zvm_doc/5_Running_and_Debugging.rst b/zvm_doc/5_Running_and_Debugging.rst deleted file mode 100644 index 6e27647f91b4fa8bfa4322fc44a1538c7d29e051..0000000000000000000000000000000000000000 --- a/zvm_doc/5_Running_and_Debugging.rst +++ /dev/null @@ -1,180 +0,0 @@ -运行和调试系统 -====================== - - -ZVM系统运行配置 ----------------- - -QEMU 平台 -^^^^^^^^^^^^^^^^^^^ - -qemu版本及配置: -~~~~~~~~~~~~~~~~~~ -- QEMU version: 6.2.0 -- QEMU model: board ``virt`` with cpu ``max`` -- Run command: - -本项目基于的qemu软件来实现系统的启动和演示。需要注意的是,由于原生qemu仅支持一个非安全空间的串口,为方便演示, -我们给qemu添加了增加两个串口的补丁,补丁文件位于: - -.. code:: shell - - ../zvm_config/qemu_platform/qemu/*.patch - -使用说明参照该目录下的'README.rst'文件。qemu6.2.0仓库可以通过如下命令拉取 - -.. code:: shell - - git clone https://github.com/cocoeoli/qemu.git - -拉取完成后,进入qemu仓库开始并对相关文件打好补丁,然后开始配置qemu。 - -.. code:: shell - - cd path-to/qemu - mkdir build - ../configure --target-list=aarch64-softmmu - make - make install - -生成镜像文件位于'/path-to/qemu/build/aarch64-softmmu/'目录下,此时可以开始执行相关运行命令。 - - -qemu platform 运行zvm: -~~~~~~~~~~~~~~~~~~~~~~~~ - -运行zvm方式有两个: - -注: **脚本文件和命令中的'path-to'都需要替换为正确的路径。** - -1. 通过`auto_build.sh`脚本执行: - -.. code:: shell - - ./auto_build.sh debugserver qemu - -2. 直接执行命令: - -.. code:: shell - - /path-to/qemu-system-aarch64 \ - -cpu max -m 4G -nographic -machine virt,virtualization=on,gic-version=3 \ - -net none -pidfile qemu.pid -chardev stdio,id=con,mux=on \ - -serial chardev:con -mon chardev=con,mode=readline -serial pty -serial pty -smp cpus=4 \ - -device loader,file=/path-to/zephyr.bin,addr=0x48000000,force-raw=on \ - -device loader,file=/path-to/Image,addr=0x80000000,force-raw=on \ - -device loader,file=/path-to/linux-qemu-virt.dtb,addr=0x88000000 \ - -kernel /path-to/zvm_host.elf - -执行上面命令则会正常启动zvm,并打印如下shell,此时开始可以测试相应命令了。 - -.. code:: shell - - zvm_host:~# - - -Arm FVP 平台 -^^^^^^^^^^^^^^^^^^^ -Arm FVP 平台需要下载ARM DS2021,并进行一系列配置,具体教程后续再添加, - -平台配置 -~~~~~~~~~~~~~~~~ - -- FVP Model: Cortex-A55x4_Cortex-A75x2(Installed with Arm DS2021) -- paramters: - ``-C bp.secure_memory=0 -C cache_state_modelled=0 -C pctl.startup=0.0.*.* \ - -C bp.refcounter.non_arch_start_at_default=1 -C bp.terminal_0.mode=raw \ - -C bp.terminal_1.mode=raw -C bp.terminal_2.mode=raw`` - -FVP加载镜像 -~~~~~~~~~~~~~~~~~~ - - Host: ‘zvm_host.elf’ - -Load zvm_host.elf to address: 0x80000000. - - guest: ‘zephyr.bin and ‘linux-system.axf’ - -Load zephyr.elf to address: 0xa0000000 Load linux-system.axf to address: 0xb0000000 - -运行 -~~~~~~~ - -Open Arm DS2021 and click the ``run`` button。 - - -虚拟机生命周期 --------------- - -ZVM中虚拟机的状态有以下几种: -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1. 未运行状态(VM_STATUS_NEVER_RUN):此状态VM未运行,只是创建了一个VM实体,等待首次调度。 -2. 运行状态(VM_STATUS_RUNNING):此状态VM正在运行,并占用处理器资源。 -3. 挂起状态(VM_STATUS_PAUSE):此状态VM暂停,相关线程在等待队列中,不占用物理CPU,随时可以调度。 -4. 停止状态(VM_STATUS_STOP):此状态VM停止,相关线程都停止执行,相关内存和I/O资源准备释放。 - -一个完整的生命周期包括VM的创建、VM的运行、VM的暂停和VM的退出等一系列流程。 -用户通过相应的shell接口实现对VM在各种状态下的切换。 - - -测试ZVM命令 --------------- - -创建虚拟机: -^^^^^^^^^^^^^^^^^^^ - -.. code:: c++ - - zvm new -t linux # new a linux vm with vmid that allocated by system. - - zvm new -t zephyr # new a zephyr vm with vmid that allocated by system. - - -运行虚拟机: -^^^^^^^^^^^^^^^^^^^ - -.. code:: shell - - zvm run -n 0 # run the vm with vm\'s vmid equal to 0 - - zvm run -n 1 # run the vm with vm\'s vmid equal to 1 - - -取消虚拟机: -^^^^^^^^^^^^^^^^^^^ - -.. code:: shell - - zvm pause -n 0 # pause the vm with vm\'s vmid equal to 0 - - zvm pause -n 1 # pause the vm with vm\'s vmid equal to 1 - - -打印虚拟机信息: -^^^^^^^^^^^^^^^^^^^ - -.. code:: shell - - zvm info # list vms. - - -删除虚拟机: -^^^^^^^^^^^^^^^^^^^ - -.. code:: shell - - zvm delete -n 0 # delete the vm with vm\'s vmid equal to 0 - - zvm delete -n 1 # delete the vm with vm\'s vmid equal to 1 - - -`Prev>> ZVM系统构建: `__ - -`Next>> 拓展技术介绍: `__ - - -问题反馈 --------- -欢迎大家反馈开发中遇到的问题,下面是联系邮箱。 -[1] xiongcl@hnu.edu.cn \ No newline at end of file diff --git a/zvm_doc/6_Expansion_Technology.rst b/zvm_doc/6_Expansion_Technology.rst deleted file mode 100644 index 0117c2681bfe4187c262c696d3362f8d7e171a38..0000000000000000000000000000000000000000 --- a/zvm_doc/6_Expansion_Technology.rst +++ /dev/null @@ -1,108 +0,0 @@ -拓展技术支持 -============ - -1.内存设计优化方案 -^^^^^^^^^^^^^^^^^^^^^^ - -(1)整体架构 -~~~~~~~~~~~~~~~~ - -ZVM 提供了两阶段的内存映射,第一阶段是从zephyr的内核空间映射到物理内存地址, -第二阶段是虚拟机的物理地址映射到zephyr的物理地址空间。第一阶段的映射主要是把对应内核镜像映射到zephyr物理地址空间中, -第二阶段的映射是使用vm_mem_partition 和 vm_mem_block 进行映射,具体如下图所示。 - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_opt_arch.png - - -(2)动态分配内存 -~~~~~~~~~~~~~~~~ - -ZVM 提供了 CONFIG_VM_DYNAMIC_MEMORY 这一个宏可以让用户自由的选择是否动态分配内存, -如果选择静态的内存分配,每一个虚拟机都将得到一个vm_mem_partition 记录整体的内存分配状态, -否则将使用vm_mem_block记录内存的映射。在vm_mem_partion 中维护一条关于block的双向链表, -block的大小和映射范围可以动态的变化,这样就实现了内存的动态分配。基于双向链表的静态内存记录如下图所示。 - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_opt_list.png - - -(3)压缩分区 -~~~~~~~~~~~~~~~~ - -为了减少嵌入式系统的内存损耗,我们拟在ZVM 在内存初始化的过程中从 zephyr -的heap中分配了一块压缩分区,当内存紧张的时候,将会把一部分不常用的block压缩至压缩分区中, -之后如果有请求再把它从压缩分区中恢复。我们采用 LZO 算法进行无损压缩,LZO 具有较高的压缩速度和较低的内存需求, -缺点是压缩率不是很高,符合ZVM的使用场景。内存压缩方案概览图如下图所示。 - - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/mem_compress.png - - -2.virtIO虚拟化方案 -^^^^^^^^^^^^^^^^^^^^^^ - -(1)整体架构 -~~~~~~~~~~~~~~~~ - -在虚拟化系统中,I/O资源是有限的,为了满足多个Guest OS的需求,VMM必须通过I/O虚拟化的方式来复用有限的I/O资源。 -现有的I/O虚拟化方案可以分为三类:全虚拟化、半虚拟化和 I/O 透传。 -其中全虚拟化方案就是通过纯软件的形式来模拟I/O设备并处理虚拟机的 I/O 请求, -虽然因为无需对操作系统做修改而获得了较好的可移植性和兼容性,但大量的上下文切换也造成了巨大的性能开销。 -半虚拟化是一种软硬件结合的方式,它提供了一种机制,用于接收并转发Guest端的I/O请求到Host端, -最终由主机的硬件处理这些I/O请求,同时也可以接收并转发Host端的I/O响应到Guest端。这样既能够有序的处理I/O请求, -又能够减少性能开销。I/O透传技术让虚拟机独占一个物理设备,并像宿主机一样的使用物理设备, -因此其需要依赖虚拟内存技术,以实现不同虚拟机之间内存空间的隔离。 -基于ZVM的嵌入式应用场景以及Zephyr操作系统的实时性要求,本方案选用半虚拟化的I/O虚拟化方案, -以Linux系统中的VirtI/O框架作为设计参考。 - -整体虚拟化架构如图所示,共分为三个部分:前端的驱动程序virtio-driver, -后端的虚拟设备virtio-device以及用于连接二者的virtio-queue。 -前端的virtio-driver以内核模块的形式存在于Guest OS中,其核心职责是: 接收来自用户进程的I/O请求, -将这些 I/O 请求转移到相应的后端虚拟设备中,并从virtio-device中接收已经处理完的I/O响应数据。 -后端的virtio-device存在于ZVM中,ZVM以内核模块的形式载入主机操作系统Zephyr。其核心职责是: -接收来自相应前端virtio驱动程序的I/O请求,使用物理硬件来处理这些I/O请求,并将响应数据暴露给前端驱动程序。 -virtio-queue是一种数据结构,其位于主机和虚拟机都能访问的共享内存中, -其是前端驱动程序和后端虚拟设备消息传输的通道,对I/O请求和I/O响应的操作满足生产者-消费者模型。 - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_arch.png - - -(2)virtio-queue设计 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -如下图所示,virtio-queue是一组缓冲区块组成的队列,每一个缓冲区块都可以设置为可读或可写。 -virtio-driver和virtio-device通过virtio-queue进行数据交流, -每一个virtio-device绑定了一定数量的virtio-queue。Guest OS中的virtio-driver捕获I/O请求之后, -将I/O请求信息写入一个缓冲区块,并将其添加到相应设备的virtio-queue中。 -而VMM中的virtio-device从相应设备的virtio-queue中读取并处理I/O请求, -并将响应信息写回到相应的virtio-queue中。 - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_queue.png - - -(3)virtio-driver设计 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -不同的外设需要设计不同的驱动程序,具体表现为绑定的virtio-queue数量, -virtio-queue中缓冲区的结构以及对缓冲区的操作不同,本方案暂只对块设备驱动程序的设计方法进行说明。 -块设备只绑定了一个virtio-queue,这个virtio-queue即用于保存I/O请求,也用于保存I/O响应数据。 -virtio-queue中的缓冲区结构如图3(左)所示,在原始的virtio框架中, -每个缓冲区的前16个字节总是一个只读的描述符结构,该描述符结构如图3(右)所示,type成员用于指示该缓冲区是只读、 -只写还是通用的SCSI命令以及在这个命令之前是否应该有一个写障碍。 -ioprio成员用于指示该缓冲区中保存的I/O请求的优先级,值越大则优先级越高。sector成员指示磁盘操作的偏移量。 -缓冲区的最后一个字节是只写的,如果请求成功则写入0,失败则写入1,不支持该请求则写入2。 -剩余的缓冲区部分的长度以及类型依据于请求的类型而定。 - -.. figure:: https://gitee.com/cocoeoli/zvm/raw/master/zvm_doc/figure/virtIO_driver.png - - -(4)virtio-device设计 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -后端的virtio-device主要需要进行的是I/O事件的通知,当从virtio-queue中读取到一个I/O请求时, -虚拟设备需要通知真实的物理设备对I/O请求进行处理,在本方案中,拟设计一个API将I/O请求分发到Host的I/O调度器上, -由Host完成之后的操作。 - - - -`Prev>> ZVM运行与调试: `__ - - -`Next>> ZVM后续规划: `__ - diff --git a/zvm_doc/7_Todo_List.rst b/zvm_doc/7_Todo_List.rst deleted file mode 100644 index e100c0ab78126e2851a2d1db59eb4752d4920011..0000000000000000000000000000000000000000 --- a/zvm_doc/7_Todo_List.rst +++ /dev/null @@ -1,17 +0,0 @@ -未来规划 -========== - -现阶段实现计划 ---------- -- [√] 能够在FVP和QEMU模拟平台上运行,能够支持启动至少两个及以上虚拟机(Linux, Zephyr)。 -- [√] 能够在QEMU模拟平台上运行,能够支持启动至少两个及以上虚拟机(Linux, Zephyr)。 -- [×] 能够支持虚拟化平台部署在openEuler Embedded平台上。 -- [×] 能够支持虚拟机间的实时通信。 -- [×] 能够支持virtIO等设备虚拟化框架。 - - - - -`Prev>> 拓展技术介绍: `__ - -`Next>> 加入我们: `__