# 近来做 Stanford CS140e 的一些进展和思考（4）

在[上一篇文章](https://jia.je/programming/2018/02/16/thoughts-on-stanford-cs140e-3/index.md)之后，作者多次延期跳票之后，终于放出了 `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` 里面很轻易就可以实现的指针操作，也花了不少时间。

更新：[下一篇在这里](https://jia.je/programming/2018/03/03/thoughts-on-stanford-cs140e-5/index.md)。
