第5课 - 主引导程序的扩展(下)
1. 在 FAT12 根目录中查找目标文件
1.1 根目录区的大小和位置
其中:BPB_RootEntCnt 表示最大根目录文件数(即最大目录项的个数,默认是 0xE0,224)
RootEntry 表示根目录区每个目录项的大小(32 Bytes)
BPB_BytsPerSec 表示每扇区的字节数(512 Bytes)
224 * 32 = 7168 B 7168/512 = 14扇区
1.2 FAT12 文件系统中的根目录区
根目录区由目录项构成,每一个目录项代表根目录中的一个文件索引。
在 FAT12 中,1簇 = 1扇区。
目录项中的关键成员:
-
- DIR_Name
文件名(用于判断是否为目标文件)
-
- DIR_FstClus
文件数据起始存储位置(用于确定读取位置)
-
- DIR_FileSize
文件大小(用于确定读取的字节数)
1.3 实验:读取 FAT12 文件系统的根目录信息
— 步骤:
-
- 创建 RootEntry 结构体类型
- 使用文件流顺序读取每个项的内容
- 解析并打印相关的信息
2. 介绍 FAT 表
2.1 FAT 表 - FAT12 的数据组织核心
(1)FAT1 和 FAT2 是相互备份的关系,数据内容完全一致
(2)FAT 表是一个关系图,记录了文件数据的先后关系
(3)每一个 FAT 表项占用 12 比特
(4)FAT 表的前 2 个表项规定不使用
2.2 FAT 表中的先后关系
(1)以簇(扇区)为单位存储文件数据
(2)每个表项( vec[i] )表示文件数据的实际位置(簇)
-
- DIR_FstClus 表示文件第 0 簇(扇区)的位置
- vec[DIR_FstClus] 表示文件第 1 簇(扇区)的位置
- vec[vec[DIR_FstClus]] 表示文件第 2 簇(扇区)的位置
- ......
2.3 FAT12 数据物理组织示意
2.4 FAT12 数据逻辑组织示意
2.5 实验:加载 FAT12 中的文件数据
— 步骤:
-
- 在根目录区查找目标文件对应的项
- 获取目标文件的起始簇号和文件大小
- 根据 FAT 表中记录的逻辑先后关系读取数据
3. 小贴士
3.1 小贴士一
(1)FAT 表中的每个表项只占用 12 比特(1.5字节)
(2)FAT 表一共记录了 BPB_BytsPerSec * 9 * 2 / 3 个表项
(3)可以使用一个 short 表示一个表项的值
(4)如果表象值大于等于 0xFF8 ,则说明已经到达最后一个簇
(5)如果表项值等于 0xFF7 ,则说明当前簇已经损坏
3.2 小贴士二
(1)数据区起始簇()号为33,地址为 0x4200
(2)数据区起始地址所对应的编号为 2(不为 0)
(3)因此,DIR_FstClus 对应的地址为:
-
- 0x4200 + ( DIR_FstClus - 2 ) * 512
【编程实验:读取指定文件内容】
4. 小结
(1)FAT12 根目录区记录了文件的起始簇号和长度
(2)通过查找根目录区能够确定是否存在目标文件
(3)FAT12 文件数据的组织使用了单链表的思想
— 文件数据离散的分布于存储介质中
— 文件数据通过 FAT 项进行关联
注:本文整理于《狄泰12月提升计划》课程内容
狄泰QQ群:199546072
本人QQ号:502218614