Skip to content

Commit ba5a59f

Browse files
committed
almost finish ch9:0
1 parent b6637e4 commit ba5a59f

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

source/chapter9/0intro.rst

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,5 +320,37 @@
320320
操作系统设备驱动程序
321321
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
322322

323+
由于有了裸机设备驱动程序的实现,对于操作系统设备程序,可以直接访问裸机设备驱动程序的各种功能。这样操作系统设备驱动程序的复杂性和代码量大大降低,整个代码量不到100行。不过还需解决如下一些关键问题:
324+
325+
- 发现具体计算机(如 ``virt machine`` )中的设备(即与设备交互的设备控制寄存器的MMIO内存地址);
326+
- 与其它操作系统内核模块(如文件系统、同步互斥、进程管理等)的对接;
327+
- 封装裸机设备驱动程序,提供操作系统层面的I/O设备访问能力(初始化、读写、控制等操作)。
328+
329+
另外,操作系统还需满足裸机设备驱动程序对操作系统的需求,并能对各种外设进行统一的管理,这主要集中在硬件平台级的支持。主要的服务能力包括:
330+
331+
- 在硬件平台层面发现具体计算机(如 ``virt machine`` )中的各种外设的能力;
332+
- 在硬件平台层面的外设中断总控能力,即在外设中断产生后,能分析出具体是哪个外设产生的中断,并进行相应的处理;
333+
- 给裸机设备驱动程序提供操作系统级别的服务能力,以 ``virtio-drivers`` 为例,OS需要提供 ``HAL`` Trait的具体实现,即驱动进行I/O操作所需的内存动态分配。
334+
335+
以面向 ``virtio-blk`` 外设的操作系统驱动为例,我们可以看看上述过程的具体实现。在硬件平台的总体支持方面,为简化操作,通过对Qemu的分析,在操作系统中直接给出 ``virt machine`` 中各个外设的控制寄存器地址(代码位置: ``os/src/boards/qemu.rs`` )。为了完成外设中断总控,操作系统提供了 ``PLIC`` 驱动,支持对 ``virt machine`` 中各种外设的中断响应(代码位置: ``os/src/drivers/plic.rs`` )。
336+
337+
在具体设备驱动实现上,首先是发现设备,操作系统建立了表示virtio_blk设备驱动的全局变量 ``BLOCK_DEVICE`` (代码位置: ``os/src/drivers/block/mod.rs`` )。为简化发现设备的过程,操作系统直接指定了virtio_blk设备在 ``virt machine`` 中的设备控制寄存器地址 ``VIRTIO0``。
338+
339+
然后是驱动程序初始化、读写块和中断处理的实现(代码位置: ``os/src/drivers/block/virtio_blk.rs`` )。在操作系统的第一次访问 ``BLOCK_DEVICE`` 时,会执行 ``VirtIOBlock::new()`` 方法,通过调用virtio_blk裸机设备驱动库中的功能,完成了块设备驱动的初始化工作,并初始化条件变量,用于后续块读写过程中与进程的交互(即让等待I/O访问结果的进程先挂起)。
340+
341+
块设备驱动的服务对象是文件系统,它们之间需要有一个交互的接口,这就是在 ``easy-fs`` 文件系统模块定义的 ``BlockDevice`` trait:
342+
343+
.. code-block:: Rust
344+
:linenos:
345+
346+
pub trait BlockDevice: Send + Sync + Any {
347+
fn read_block(&self, block_id: usize, buf: &mut [u8]);
348+
fn write_block(&self, block_id: usize, buf: &[u8]);
349+
fn handle_irq(&self);
350+
}
351+
352+
操作系统块设备驱动程序通过调用裸机块设备驱动程序库,可以很简洁地实现上述功能。在具体实现上,在调用了裸机块设备驱动程序库的读写块方法后,通过条件变量让等待I/O访问结果的进程先挂起)。在中断处理的方法中,在得到I/O读写块完成的中断信息后,通过条件变量唤醒等待的挂起进程。
353+
354+
至此,就分析完毕操作系统设备驱动程序的所有功能了。接下来,我们就可以深入分析到I/O设备管理的级别概念、抽象描述和侏罗猎龙操作系统的具体实现。
323355

324356
.. [#juravenator] 侏罗猎龙是一种小型恐龙,生活在1亿5千万年前的侏罗纪,它有独特的鳞片状的皮肤感觉器官,具有类似鳄鱼的触觉、冷热以及pH等综合感知能力,可能对狩猎有很大帮助。

0 commit comments

Comments
 (0)