Skip to content

Commit

Permalink
add part of overview and PCI-Virtualization (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
dallasxy authored Jul 20, 2024
1 parent 44f0e22 commit 1e07bda
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
20 changes: 19 additions & 1 deletion src/chap01/Overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,22 @@

# 欢迎使用 hvisor!

Hello~
[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. **安全研究**:提供一个隔离环境,用于安全研究和恶意软件分析。
43 changes: 43 additions & 0 deletions src/chap04/subchap03/PCI-Virtualization.md
Original file line number Diff line number Diff line change
@@ -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设备。

0 comments on commit 1e07bda

Please sign in to comment.