上一篇文章之后,作者多次延期跳票之后,终于放出了 Assignment 2 Phase 2:32-bit Lipids ,这两天就把只读 FAT32 写完了(不过封装得并不好,许多地方利用了 pub(super) 把变量可以访问的范围控制到 vfat 中,然后直接读,只有少数需要特殊处理的进行了函数的封装)。首先当然是研究了半天 MBRFAT32 的结构,拿了不同来源的 FAT 结构说明进行对比和验证,最后终于把格式搞清楚了,先实现了 MasterBootRecord ,这个其实很好实现,以前也有接触过 MBR ,本身也很简单。然后就是根据 MBR 找到第一个 FAT32 的分区,根据偏移找到分区的开头,开头的第一个扇区就是 EBPB 数据结构,里面保存了 FAT32 分区的各种信息。根据里面的信息,可以找到 FAT 表的位置和数量,还有数据部分的 Cluster 的位置和数量。接着,解析一下 FAT 表,实际上是一个与 Cluster 一一对应的链表结构,用特殊的数据代表链表的尾和空、坏扇区。利用这些,和 EBPB 中根目录所在的第一个 Cluster ,先在 VFat 里面实现了读取一个 Cluster 链的内容的函数,利用这个函数读取一个一个的目录项,解析目录项,把长文件名的项合并到一个之中,然后对应地丢到 Entry 对象中,目录则可以枚举子目录项,根据名字比较去找子目录或者子文件夹,文件则实现了 io::Readio::Seek 使得可以读取文件的内容。实现好了这些以后,就拿了 raspbian-strech-lite.img 作为硬盘映像,从文件里读取文件信息,成功地把 config.txt 读取出来。

其中还是遇到许多困难,如各种偏移的计算,如何处理跨 Cluster 和跨 Sector 的读写,等等,有不少的坑在其中,花了两天的空余时间才差不多完善了这个功能。还有就是利用 Rust 现有的功能完成 C 里面很轻易就可以实现的指针操作,也花了不少时间。