现状
目前,DragonOS暂时只支持“具有分区表的磁盘设备”。如果一个磁盘设备上的空间,直接被格式化为某个文件系统,那DragonOS暂时无法识别这样的文件系统。
需求
- 支持“没有创建分区表的磁盘设备”。使得DragonOS能够识别他们。
- 支持从这种磁盘设备上启动内核。
初步设想方案
对象关系
提出gendisk抽象,用于表示每个磁盘分区。原有的BlockDevice trait则表示具体的磁盘设备。
关系如下:
每个磁盘设备是一个BlockDevice,并且对应多个GenDisk。其中,Gendisk的数量为这个磁盘设备上的分区的数量。
如果该Block Device没有分区表,那么Gendisk对应的扇区范围则是BlockDevice的所有扇区范围。
磁盘设备插入
- 当磁盘设备插入时,创建BlockDevice,检测其是否具有分区表。
- 如果有分区表,则为各个分区创建Gendisk对象,并设置其扇区范围。
- 如果没有分区表,则创建一个扇区范围与磁盘设备完全一致的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进行挂载。