naos-riscv(block.c)源码分析

部署运行你感兴趣的模型镜像

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

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

能看到是给设备起名同时注册到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。

然后移动指针(准备下一次循环)。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值