File tree Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Original file line number Diff line number Diff line change 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等综合感知能力,可能对狩猎有很大帮助。
You can’t perform that action at this time.
0 commit comments