
这里能看到是块设备的全局数组。还有一个记录块设备个数的全局变量。

这里能看到函数的定义(参数)。这里很清楚,就是把传入的块设备记录进全局数组。

能看到是给设备起名同时注册到devfs。
![]()
当前这里看是只循环一次。
![]()
这里能看到这里的一个定义,(也是一个全局数组+全局变量)
这个数组是用来存储系统所有分区的信息。(每探测到一个就填写一个)

这里是读取偏移512字节处的结构,目的是读取GPT header,GPT header在LBA1(第一个扇区)。

检测GPT有效性:如果这里不是EFI PART 或者entries为0。就认为不是GPT。跳转到MBR去检测。

这里是宏的定义。

读取GPT分区表:
buffer->partition_entry_lba(指表明分区表的起始LBA(通常是2或更大))这里是按照128个条目来进行read。

这里的循环也是按照128来做。
把非0的条目视作有效。starting_lba和ending_lba写入part。设备类型设置为GPT。id用i(也就是设备号)。然后注册成分区设备。同时给全局变量++。

这里GPT路径结束(释放内存,然后进入下一次循环)。

这里能看到一个0x8001。是32768+1,
为什么是这个呢?因为ISO9660的Primary Volume Descriptor(PVD)位于逻辑块16的扇区内,CD001字符串。
检测到之后,讲整个盘作为一个RAW分区。staring_lba=0, ending_lba=blkdev_ioctl()/512.注册为一个DEV_PART.
然后是全局变量++,释放,进行下一次循环。

读取偏移0(第一个扇区)。检查末尾两个字节是否为0xAA55.(这是MBR的signature)。
如果不是,将整个盘作为RAW(整盘单一分区)并注册。

这里是MBR分区解析
可以看到是4个分区项。每个分区包含start_lba和sectors_limit。
然后去注册设备。

当注册完毕。全局变量记录的块设备数++。

卸载块设备(这里的ptr是块设备驱动的私有数据指针)。清除原本的数据(0orNULL)

这里是块设备的ioctl(输入输出控制)接口。用于执行设备的特殊操作
IOCTL_GETSIZE:返回块设备总容量
文件系统挂载获取磁盘大小,
RAW分区检查,mbr/iso9660.
工具,例如df、fdisk会用到。
IOCTL_GETBLKSIZE:返回块大小。一般是512。

这里是拿到对应的blkdev对象。(设备注册了。也就是ptr不为空,同时有注册底层read函数)

设置当前task状态,表示当前任务正在执行不可中断的IO。(LINUX风格)

这里是计算需要读取的扇区。
这里会有不对齐的问题。

分配临时缓冲区,底层read是“整扇区读”。不能直接到buf(buf可能不是按照扇区对齐的)

这里是快速读(完全对齐的读,offset % block_size==0.说明起始点是0、512、1024类似这样的,也就是起点对齐。后面的len%block_size==0,说明长度是整数呗。也就是读512、1024这样的。
这里做了分批读,底层有max_op_size的限制。
调用底层的read函数进行读。然后memcpy到buf里面(从tmp到buf)。
后面是释放掉临时申请的tmp。然后task->state设置为READY;
返回总共拷贝了多少。
🐢 慢速路径:未对齐读
这里是如果offset 或者length没有对齐。(必须执行读整个扇区+拷贝部分数据)


这里是单次IO大小不要超过驱动限制(max_op_size)

这里进行底层读取(总是整个扇区读)。

拷贝tmp-》buf。
然后移动指针(准备下一次循环)。

被折叠的 条评论
为什么被折叠?



