From 1e07bdad46aaedd1186bb7a0d1ed4f14643b9d59 Mon Sep 17 00:00:00 2001 From: dallasxy <124949998+dallasxy@users.noreply.github.com> Date: Sat, 20 Jul 2024 19:19:33 +0800 Subject: [PATCH] add part of overview and PCI-Virtualization (#11) --- src/chap01/Overview.md | 20 +++++++++- src/chap04/subchap03/PCI-Virtualization.md | 43 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/chap01/Overview.md b/src/chap01/Overview.md index 9154ec2..e972be3 100644 --- a/src/chap01/Overview.md +++ b/src/chap01/Overview.md @@ -4,4 +4,22 @@ # 欢迎使用 hvisor! -Hello~ \ No newline at end of file +[hvisor](https://github.com/syswonder/hvisor)是一款轻量级Type-1虚拟机监控器,使用Rust语言编写,可以提供高效的资源管理和低开销的虚拟化性能。 + +特点 +1. **跨平台支持**:支持AARCH64,RISC-V,LoongArch等多种架构。 +2. **轻量级**:专注于核心虚拟化功能,避免了传统虚拟化解决方案中的不必要复杂性,适合资源受限的环境。 +3. **高效**:直接运行在硬件上,无需通过操作系统层,提供接近原生的性能。 +4. **安全性**:Rust语言以其内存安全性和并发编程模型著称,有助于减少内存泄漏、数据竞争等常见的系统级编程错误。 +5. **快速启动**:设计简洁,启动时间短,适合需要快速部署虚拟化的场景。 + +主要功能 + +1. **虚拟机管理**:提供创建、启动、停止和删除虚拟机的基本管理功能。 +2. **资源分配与隔离**:支持对CPU、内存和I/O设备的高效分配和管理,通过虚拟化技术确保不同虚拟机之间的隔离,提升系统安全性和稳定性。 + +使用场景 + +1. **边缘计算**:适合在边缘设备上运行,为IoT和边缘计算场景提供虚拟化支持。 +2. **开发和测试**:开发者可以快速创建和销毁虚拟机环境,用于软件开发和测试。 +3. **安全研究**:提供一个隔离环境,用于安全研究和恶意软件分析。 diff --git a/src/chap04/subchap03/PCI-Virtualization.md b/src/chap04/subchap03/PCI-Virtualization.md index e69de29..095b6c9 100644 --- a/src/chap04/subchap03/PCI-Virtualization.md +++ b/src/chap04/subchap03/PCI-Virtualization.md @@ -0,0 +1,43 @@ +PCI设备主要有三个空间:配置空间(Configuration Space)、内存空间(Memory Space)和I/O空间(I/O Space)。 + +### 1. 配置空间(Configuration Space) +- **用途**:用于设备初始化和配置。 +- **大小**:每个PCI设备都有256字节的配置空间。 +- **访问方式**:通过总线编号、设备编号和功能编号进行访问。 +- **内容**: + - 设备标识信息(如供应商ID、设备ID)。 + - 状态和命令寄存器。 + - 基地址寄存器(BARs),用于映射设备的内存空间和I/O空间。 + - 中断线和中断引脚等信息。 + +### 2. 内存空间(Memory Space) +- **用途**:用于访问设备的寄存器和内存,适用于高带宽访问。 +- **大小**:由设备制造商定义,映射到系统内存地址空间中。 +- **访问方式**:通过内存读写指令进行访问。 +- **内容**: + - 设备寄存器:用于控制和状态读取。 + - 设备专用内存:如帧缓冲区、DMA缓冲区等。 + +### 3. I/O空间(I/O Space) +- **用途**:用于访问设备的控制寄存器,适用于低带宽访问。 +- **大小**:由设备制造商定义,映射到系统的I/O地址空间中。 +- **访问方式**:通过特殊的I/O指令(如`in`和`out`)进行访问。 +- **内容**: + - 设备控制寄存器:用于执行特定的I/O操作。 + +### 总结 +- **配置空间**主要用于设备初始化和配置。 +- **内存空间**用于高速访问设备的寄存器和内存。 +- **I/O空间**用于低速访问设备的控制寄存器。 + +pci的虚拟化主要是对上述的三个空间做管理。考虑到多数设备中并不存在多条pci总线,且该pci总线的所有权一般归属于zone0,为了保证zone0中pci设备的访问速度,当不存在需要将该总线上的设备分配给其他zone时,hvisor并不会对zone0的pci总线及pci设备做任何处理。 + +在将PCI设备分配给zone时,我们需要确保zone0中的Linux不再使用它们。只要设备被分配给其他zone,那么zone0就不应该访问这些设备。很遗憾,我们不能仅仅使用PCI热插拔来在运行时移除/重新添加设备,因为Linux可能会重新编程BARs并定位资源到我们不期望或者不允许的位置。因此,需要一个存在于zone0内核中的驱动拦截对这些PCI设备的访问,我们将目光投向了hvisor tool。 + +hvisor tool会将自己注册为一个PCI虚拟驱动程序,并在其他zone使用这些设备时声明对这些设备的管理权。在创建zone之前,hvisor会让这些设备从他们自己的驱动程序中解绑并绑定到hvisor tool。当一个zone被销毁时,这些设备实际上已经没有zone使用,但是在zone0看来hvisor tool仍然是一个有效的虚拟驱动程序,所以设备的释放需要手动完成。hvisor tool会释放绑定到这些zone的设备,从zone0 linux的角度来看,这些设备不被绑定到任何驱动程序,那么如果需要使用这些设备linux会自动的重新绑定正确的驱动程序。 + +现在我们需要让zone能够正确的访问到pci设备,为了尽可能简洁的完成这一目标,我们直接复用了pci总线的结构,也就是说,关于pci总线的内容会同时出现在需要使用该总线上设备的设备树中,但是除了真正拥有这条总线的zone以外,其他zone只能通过mmio由hvisor代理访问该设备,当zone试图访问一个PCI设备时,hvisor会检查是否拥有该设备的所有权,所有权在zone创建时一同被声明。如果zone访问一个属于自己的设备的配置空间,hvisor会正确的返回信息。 + +目前,I/O空间和内存空间的处理方案与配置空间相同。因为bars资源的唯一性,配置空间不可能被直接分配给zone,且对bar空间的访问频率很低,并不会过多的影响效率。但是I/O空间和内存空间的直接分配是理论上可行,进一步会将I/O空间和内存空间直接分配给对应的zone以提高访问速度。 + +为了方便在QEMU中测试PCI虚拟化,我们编写了一个PCI设备。 \ No newline at end of file