Virtio Gpu驱动移植

  • 2023年 11月27日
  • 读完约需 4 分钟
  • 最后更新于 2023年 11月27日

计划

移植准备分两步完成:首先是在 rCore-N 的源码树里面集成进 virtio-drivers 中关于 gpu 的部分,然后是根据前一步对驱动的熟悉,考虑哪些部分可以异步实现,准备是在赵方亮老师的共享调度器基础上来实现异步。

将 virtio-driver 移植到 rCore-N

首先要做的是让 virtio-drivers 能在 rCore-N 里面正常运行,借此熟悉 virtio gpu 的原理和具体实现。

没有直接采用在 Cargo.toml 中引用 virtio-drivers 的方式原因有二:

  • 后续想要在此基础上改成异步,先直接集成源码后续修改感觉方便些。
  • virtio-drivers 本身只提供了和硬件( 这里是 qemu )打交道的部分,和应用程序交道的部分是以 example 的形式给出的,而我们的目标是给定一个用户空间可用的完整驱动。

关于驱动的定义

先清晰一下驱动程序的概念:驱动程序本身可以位于操作系统内核或是用户空间,对riscv系统来说,即可以执行在S(M)态,也可以在U态执行。驱动程序各组成部分,按服务对象不同,可以粗略分为面向设备的部分和面向用户程序的部分。面对设备的部分根据硬件提供的参数完成硬件的初始化、启动、停止、探测、移除等工作,后续我们将这部分代码放在device的部分。面向用户程序的部分主要提供接口给用户程序调用,完成控制和使用相关的功能,这部分代码准备放在driver目录。

virtio gpu 设备

virtio gpu 设备,在 qemu 中是使用 mmio 的方式挂载到我们的操作系统里面的。因此它依赖于 virt mmio设备。目前 device 部分的目录结构如下:

device
├── bus
   ├── mod.rs   # 总线设备,目前仅有virtio
   └── virtio   # virtio 设备通用实现
       ├── mod.rs
       ├── queue.rs  # virt队列的实现
       ├── transport # 虚机到宿主机的转换,后详述
       │   ├── mmio.rs # mmio方式
       │   └── mod.rs # 目前仅mmio
       ├── virtio_impl.rs # 设计虚拟设备相关内存分配的功能函数,包含Hal和Dma
       └── volatile.rs # 读写virtio 设备的辅助工具函数
├── graphics
   ├── gpu.rs #virtio gpu 设备端的实现
   └── mod.rs # 包含测试设备端实现的示例
├── mod.rs
├── net
   ├── mod.rs
   └── virtio_impl.rs
├── plic.rs # 管理外设中断
└── uart.rs 

其中 virtio gpu 相关的部分有 bus/virtio、graphics和 plic.rs。

bus/virtio :bus目录存放各种总线设备的驱动,目前仅virtio,后续可扩展到其他,诸如spi、usb等等。virtio目录下有以下内容:

  • virtio_impl: 当前os下,virtio设备通用的实现。
    • Dma: