Skip to content

Commit 0e6628d

Browse files
committed
update ch8
1 parent 268e4d7 commit 0e6628d

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

source/chapter8/2device-driver-1.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
操作系统在启动后需要了解计算机系统中所有接入的设备,这就要有一个读取全部已接入设备信息的能力,而设备信息放在哪里,又是谁帮我们来做的呢?在 RISC-V 中,这个一般是由 bootloader,即 OpenSBI or RustSBI 固件完成的。它来完成对于包括物理内存在内的各外设的探测,将探测结果以 **设备树二进制对象(DTB,Device Tree Blob)** 的格式保存在物理内存中的某个地方。然后bootloader会启动操作系统,即把放置DTB的物理地址将放在 ``a1`` 寄存器中,而将会把 HART ID (**HART,Hardware Thread,硬件线程,可以理解为执行的 CPU 核**)放在 ``a0`` 寄存器上,然后跳转到操作系统的入口地址处继续执行。例如,我们可以查看 ``virtio_drivers`` crate中的在裸机环境下使用设备驱动程序的例子。我们只需要给 `rust_main` 函数增加两个参数(即 ``a0`` 和 ``a1`` 寄存器中的值 )即可:
7070

7171
.. code-block:: Rust
72+
7273
//virtio_drivers/examples/riscv/src/main.rs
7374
#[no_mangle]
7475
extern "C" fn main(_hartid: usize, device_tree_paddr: usize) {

source/chapter8/2device-driver-2.rst

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ virtio设备是虚拟外设,存在于QEMU模拟的RISC-V 64 virt 计算机中
1212
virtio架构
1313
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1414

15-
总体上看,virtio 架构可以分为四层,包括前端 guest操作系统中各种驱动程序模块,后端 Device(实现在QEMU上),中间用于前后端通信的 virtio 层,这一层是虚拟队列(virtqueue),是前后端通信的桥梁,表示设备驱动程序与设备间的数据传输机制,不过这不涉及具体实现。虚拟队列的下层是 virtio-ring,是数据传输机制的具体实现,主要由环形缓冲区和相关操作组成,用于保存前端驱动程序和后端虚拟设备之间进行命令和数据交互的信息。
15+
总体上看,virtio 架构可以分为四层,包括运行在QEMU模拟器上的前端操作系统中各种驱动程序模块,在QEMU中模拟的各种后端 Device,中间用于前后端通信的 virtio 层,这一层是虚拟队列(virtqueue),是前后端通信的接口,表示设备驱动程序与设备间的数据传输机制,不过这不涉及具体实现。虚拟队列的下层是 virtio-ring,是数据传输机制的具体实现,主要由环形缓冲区和相关操作组成,用于保存前端驱动程序和后端虚拟设备之间进行命令和数据交互的信息。
1616

1717
.. image:: virtio-arch.png
1818
:align: center
@@ -24,13 +24,14 @@ virtio架构
2424
virtio设备支持三种设备呈现模式:
2525

2626
- Virtio Over MMIO,虚拟设备直接挂载到系统总线上,我们实验中的虚拟计算机就是这种呈现模式;
27-
- Virtio Over PCI BUS,遵循PCI规范,挂在到PCI总线上,作为virtio-pci设备呈现,在虚拟x86计算机上采用的是这种模式
28-
- Virtio Over Channel I/O:主要用在IBM s390平台上,virtio-ccw使用这种基于channel I/O的机制。
27+
- Virtio Over PCI BUS,遵循PCI规范,挂在到PCI总线上,作为virtio-pci设备呈现,在QEMU虚拟的x86计算机上采用的是这种模式
28+
- Virtio Over Channel I/O:主要用在虚拟IBM s390计算机上,virtio-ccw使用这种基于channel I/O的机制。
2929

3030
virtio设备的基本组成要素如下:
3131

3232
- 设备状态域(Device status field)
3333
- 特征位(Feature bits)
34+
- 通知(Notifications)
3435
- 设备配置空间(Device Configuration space)
3536
- 一个或多个虚拟队列(virtqueue)
3637

@@ -48,15 +49,22 @@ virtio设备的基本组成要素如下:
4849

4950
**特征位**
5051

51-
特征位用于表示VirtIO设备具有的各种特性。其中bit0-bit23是特定设备可以使用的feature bits, bit24-bit37预给队列和feature协商机制,bit38以上保留给未来其他用途。设备驱动程序与设备就设备的各种特性需要有一致的认识,这样才能正确的管理设备。
52+
特征位用于表示VirtIO设备具有的各种特性。其中bit0-bit23是特定设备可以使用的feature bits, bit24-bit37预给队列和feature协商机制,bit38以上保留给未来其他用途。设备驱动程序与设备就设备的各种特性需要协商,形成一致的共识,这样才能正确的管理设备。
53+
54+
55+
**通知**
56+
57+
设备驱动程序和设备在交互中,需要互通通知对方,设备驱动程序组织好相关命令/信息要通知设备去处理I/O事务,设备处理完I/O事务后,要通知设备驱动程序进行后续事务,如回收内存,向用户进程反馈I/O事务的处理结果等。
58+
59+
设备驱动程序通知设备用doorbell机制,即写特定寄存器,QEMU进行拦截再通知其模拟的设备。设备通知设备驱动程序一般用中断机制,即在QEMU中进行中断注入,让CPU响应并执行中断处理例程,来完成对I/O执行结果的处理。
5260

5361
**设备配置空间**
5462

5563
设备配置空间通常用于配置不常变动的设备参数(属性),或者初始化阶段需要时设置的设备参数。设备的特征位中包含表示配置空间是否存在的bit位,并可通过在特征位的末尾新添新的bit位来扩展配置空间。
5664

5765
.. _term-virtqueue:
5866

59-
**虚拟队列(virtqueue)****virtio-ring**
67+
**虚拟队列(virtqueue)****virtio-ring**
6068

6169
在virtio设备上进行批量数据传输的机制被称为virtqueue,virtio设备的虚拟队列(virtqueue)可以由virtio-ring(一种环形队列)来具体实现。每个virtio设备可以拥有零个或多个virtqueue,每个virtqueue占用2个或者更多个4K的物理页。 virtqueue有Split Virtqueues和Packed Virtqueues两种模式。在Split virtqueues模式下,virtqueue被分成若干个部分, 每个部分都是前端驱动或者后端设备单向可写。 每个virtqueue都有一个16bit的 ``Queue Size`` 参数,表示队列的总长度。每个virtqueue由三部分组成:
6270

source/chapter8/4exercise.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
chapter8练习
2+
================================================
3+
4+
- 本节难度: **理解device driver比较费事,编程难度适中**

0 commit comments

Comments
 (0)