更新文件 Virtio.md

This commit is contained in:
lion187 2018-12-06 16:18:15 +08:00
parent 1f2fd0c35e
commit 97fc5c2898
1 changed files with 80 additions and 1 deletions

View File

@ -2,6 +2,22 @@
## 1、基本概念
Virtio 是一种标准虚拟化技术virtio 设备能够像普通设备那样被 Guest 系统枚举和使用。Virtio 设备具备以下特点:
* 简单易开发virtio 设备使用通用的中断和 DMA 机制,对于设备驱动开发者来说不会带来困难。
* 高效virtio 设备使用针对输入和输出使用不同的 vring规避了可能的由高速缓存带来的影响。
* 标准virtio 不假定其所处的环境。
* 可扩展virtio 设备包含一组 Feature Bits在设备安装过程中可以告知 guest OS。设备和驱动之间相互协调驱动可以根据设备提供的特性以及驱动自身能够支持的特性来最终确定在 guest OS 里面能够使用的设备特性。这样可以顾及到设备的前后兼容性。
每个 virtio 设备由以下 4 部分构成:
* 设备状态域Device status field
* 特征位Feature bits
* 设备配置空间Device Configuration space
* 一个或多个 Virtqueues
### 1.1 设备状态域
<https://www.ibm.com/developerworks/cn/linux/1402_caobb_virtio/>
<https://www.ibm.com/developerworks/cn/linux/l-virtio/index.html>
@ -10,7 +26,7 @@
## 3、Virtio 设备
## 3.1、Virtio 设备类型
### 3.1、Virtio 设备类型
主要分为 PCI 设备和非 PCI 的 mmio 设备。mmio 设备属于 Platform 设备,通过向 kernel 提供
@ -35,6 +51,69 @@ Legacy 设备使用 CONFIGURATION ADDRESS0xCF8 和 CONFIGURATION DATA PORT
其他还有 virtio vop 设备和 virtio ccw 设备vop 设备指 Intel Virtio Over PCIe (VOP) driverccw 指 Concurrent I/O (CIO) 设备。virtio vop 和 virtio ccw 是分别属于这两种类型的 virtio 设备。
### 3.2、Virtio 设备 ID
virtio 设备的 Vendor ID 为 0x1AF4Subsystem device ID 如下:
| Subsystem Device ID | Virtio Device |
|---------------------|-------------------|
| 1 | Network card |
| 2 | Block device |
| 3 | Console |
| 4 | Entropy source |
| 5 | Memory ballooning |
| 6 | IoMemory |
| 7 | Rpmsg |
| 8 | SCSI host |
| 9 | 9P transport |
| 10 | Mac80211 wlan |
### 3.3、Virtio 设备的配置空间
需要使用 PCI 设备的第一块 I/O region 来对 PCI 设备进行配置。针对 virtio 设备来说,在 device 特定的配置区域后会有一块区域存放 virtio header(下表)。
<table border="1" cellspacing="0">
<tr align="center">
<td colspan="5"> Virtio MMIO Config Space </td>
</tr>
<tr align="center">
<td> Offset </td> <td> Byte 0 </td> <td> Byte 1 </td> <td> Byte 2 </td> <td> Byte 3 </td>
</tr>
<tr align="center">
<td> 0x000 </td> <td colspan="4"> Magic Value </td>
</tr>
<tr align="center">
<td> 0x004 </td> <td colspan="4"> Version </td>
</tr>
<tr align="center">
<td> 0x008 </td> <td colspan="4"> Device ID </td>
</tr>
<tr align="center">
<td> 0x00c </td> <td colspan="4"> Vendor ID </td>
</tr>
<tr align="center">
<td> 0x010 </td> <td colspan="4"> 设备特征位 (R) </td>
</tr>
<tr align="center">
<td> 0x020 </td> <td colspan="4"> Guest 特征位 (RW) </td>
</tr>
<tr align="center">
<td> 0x030 </td> <td colspan="4"> Queue Address (RW) </td>
</tr>
<tr align="center">
<td> 0x034 </td> <td colspan="2"> Queue Size (R) </td> <td colspan="2"> Queue Select (RW) </td>
</tr>
<tr align="center">
<td> 0x050 </td> <td colspan="2"> Queue Notify (RW) </td> <td> 设备 Status (RW) </td> <td> ISR Status (R) </td>
</tr>
<tr align="center">
<td> Offset+X+5 (如果使能了MSI-X) </td> <td colspan="2"> Configuration Vector (RW) </td> <td colspan="2"> Queue Vector (RW) </td>
</tr>
<tr align="center">
<td> Offset+X+5/Offset+X+6(如果使能了MSI-X) </td> <td colspan="4"> 设备专属的 headers </td>
</tr>
</table>
## 4、Virtqueue
## 5、Network Device