第5课 - 主引导程序的扩展(下)

第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

猜你喜欢

转载自www.cnblogs.com/shiwenjie/p/9021779.html