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