【方案讨论】添加GenDisk的抽象

现状

目前,DragonOS暂时只支持“具有分区表的磁盘设备”。如果一个磁盘设备上的空间,直接被格式化为某个文件系统,那DragonOS暂时无法识别这样的文件系统。

需求

  • 支持“没有创建分区表的磁盘设备”。使得DragonOS能够识别他们。
  • 支持从这种磁盘设备上启动内核。

初步设想方案

对象关系

提出gendisk抽象,用于表示每个磁盘分区。原有的BlockDevice trait则表示具体的磁盘设备。

关系如下:
image
每个磁盘设备是一个BlockDevice,并且对应多个GenDisk。其中,Gendisk的数量为这个磁盘设备上的分区的数量。
如果该Block Device没有分区表,那么Gendisk对应的扇区范围则是BlockDevice的所有扇区范围。

磁盘设备插入

  1. 当磁盘设备插入时,创建BlockDevice,检测其是否具有分区表。
  2. 如果有分区表,则为各个分区创建Gendisk对象,并设置其扇区范围。
  3. 如果没有分区表,则创建一个扇区范围与磁盘设备完全一致的Gendisk对象。

磁盘设备被注册到BlockDeviceManager内。

设备id分配

  • 对于ahci磁盘,因为它是scsi设备,因此编写scsi驱动,在scsi那里,分配“sd[a-z]”的id。由于DragonOS目前没有scsi这一层,为了减少工作量,暂时只为scsi这里实现id分配的功能,其他的暂时不写。
  • 对于virtio磁盘,由virtio驱动自行维护id,分配vd[a-z]的id。

BlockDeviceManager

用于管理全局的所有磁盘设备。

查找gendisk

通过“设备名”以及“分区号”进行查找

有分区表的磁盘设备

路径:/sda/sda1
设备名:sda,分区号“Some(1)”。

无分区表的磁盘设备

路径:/sda/

设备名:sda,分区号“None”

文件系统挂载

文件系统与Gendisk绑定。根目录从sda或者vda进行挂载。

抄送

@SIG-Main

1 个赞

个人认为,Gendisk的抽象应该在块设备之上,可能图中blkdev和gendisk的关系要颠倒过来。

xs,我图箭头画反了,今晚更新上去

这个PR https://github.com/DragonOS-Community/DragonOS/pull/903

  • 添加gendisk抽象,表示分区
  • 自动分配sdXvdX设备名
  • 将FAT文件系统与Block Device解耦,转而绑定到Gendisk上
  • 添加磁盘设备管理器,支持注册、查找磁盘设备、分区
  • 实现把整个磁盘作为一个Gendisk的功能
  • 实现获取virtio磁盘大小的功能
  • 把磁盘、分区注册到devfs

剩余的2个任务我打算开新的PR来发。原因是:

  • 要测试“整个磁盘作为gendisk”,需要kernel先支持qemu的direct linux boot
  • 将磁盘和分区注册到devfs,功能较为独立,代码量比较多,为了控制当前这个PR的代码量,因此写到新的PR里面。
2 个赞
  • 要测试“整个磁盘作为gendisk”,需要kernel先支持qemu的direct linux boot

direct linux boot 的pr开发过程中,我已经测试了,可以把整个磁盘作为一个Gendisk。