主要参考了这篇博客.
1. 文件系统
维基百科对于文件系统给出了如下的定义和解释:
计算机的文件系统是一种存储和组织计算机数据的方法
文件系统通常使用硬盘和光盘这样的存储设备
严格地说
2. FAT
FAT (File Allocation Table, 文件分配表) 是一种由微软发明并拥有部分专利的文件系统
FAT文件系统考虑当时电脑性能有限
但FAT有一个严重的缺点
3. FAT12
初期的FAT就是现在俗称的FAT12
- 不支持分层性结构
- 簇寻址只有12位
这使得控制FAT有些棘手( ) - 而且只支持最多32M的分区.
当时入门级的磁盘是5.25"
由于唯一的根目录也必须放在第一个磁道
FAT12的基本组织单位
- byte: 基本数据单位——在FAT12中, 没有比byte更小单位的数据
- sector: 磁盘中的最小数据单元——磁盘的读写最小只能以一个sector为一个单位
- cluster: 一个cluster是一个或多个扇区
FAT12 文件系统的组成
起始扇区位置 | 长度 (单位: 扇区) | 内容 |
---|---|---|
0 | 1 | 引导扇区 (Boot Sector): 负责启动计算机并加载操作系统 |
1 | 9 | FAT1 (File Allocation Table1): 存储了文件在磁盘上的位置信息 |
10 | 9 | FAT2 (File Allocation Table2): 同上. |
19 | 14 | 根目录区 (Root Directory Region): 存储了文件系统中所有根目录下的文件和子目录的相关信息 |
33 | — | 文件数据 |
FAT12 Boot Sector
主引导区的大小为512个字节, 主引导区的构成如下表
identifier | offset (byte) | type | size | default value | description |
---|---|---|---|---|---|
BS_JmpBoot | 0 | db | 3 | 跳转指令 | |
BS_OEMName | 3 | db | 8 | MSWIN4.1 | OEM字符串, 必须为8个字符, 不足的话以空格补上 |
BPB_BytesPerSec | 11 | dw | 2 | 0x0200 | 每个扇区的字节数 |
BPB_SecPerClus | 13 | db | 1 | 1 | 每个簇的扇区数 (注意 FAT12中每个簇默认只有一个扇区) |
BPB_RsvdSecCnt | 14 | dw | 2 | 1 | Boot占用的扇区数 |
BPB_NumFATs | 16 | db | 1 | 2 | FAT表的记录数 |
BPB_RootEntCnt | 17 | dw | 2 | 0xE0 | 最大根目录文件数 |
BPB_TotSec16 | 19 | dw | 2 | 0xB40 | 逻辑扇区总数 |
BPB_Media | 21 | db | 1 | 0xF0 | 媒体描述符 |
BPB_FATSz16 | 22 | dw | 2 | 9 | 每个FAT占用的扇区数 |
BPB_SecPerTrk | 24 | dw | 2 | 0x12 | 每个磁道的扇区数 |
BPB_NumHeads | 26 | dw | 2 | 2 | 磁头数 |
BPB_HiddSec | 28 | dd | 4 | 0 | 隐藏扇区数 |
BPB_TotSec32 | 32 | dd | 4 | 0 | 如果BPB_TotSec16为0, 那么在这里记录扇区总数 |
BS_DrvNum | 36 | db | 1 | 0 | 中断13的驱动器号 |
BS_Reserved1 | 37 | db | 1 | 0 | 未使用 |
BS_BootSig | 38 | db | 1 | 0x29 | 扩展引导标志 |
BS_VolID | 39 | dd | 4 | 0 | 卷序列号 |
BS_VolLab | 43 | db | 11 | 卷标, 必须为11个字符, 不足的话以空格补上 | |
BS_FileSysType | 54 | db | 8 | FAT12 | 文件系统类型, 必须为8个字符, 不足的话以空格补上 |
BOOT_Code | 62 | db | 448 | FAT12 | 引导代码, 由offset=0处短跳转来 |
END | 510 | db | 2 | 0x55, 0xAA | 系统引导标识 |
根目录区的目录项
根目录区由若干个目录项构成, 每个目录项的大小是32个byte
member | offset (byte) | size (byte) | description |
---|---|---|---|
DIR_Name | 0 | 11 | 文件名8字节, 扩展名3字节 |
DIR_Attr | 11 | 1 | 文件属性 |
Reserve | 12 | 10 | 保留位 |
DIR_WrtTime | 22 | 2 | 最后一次写入时间 |
DIR_WrtDate | 24 | 2 | 最后一次写入日期 |
DIR_FstClus | 26 | 2 | 文件开始的簇号 |
DIR_FileSize | 28 | 4 | 文件大小 |
我真的很讨厌 markdown 的表格
FAT
FAT是FAT12的数据组织核心
在 FAT12 文件系统中, 包括两个 FAT (File Allocation Table): FAT1 和 FAT2, 两者是相互备份的关系
从数据结构的角度看, FAT表是一个有向关系图, 这个图记录了文件先后关系.
FAT表包括若干个紧密分布的表项 (FATEntry), 每个表项占用12bit (也就是说3个表项占用2个字节), 每个表项都与数据区中的一个簇相对应
- FATEntry的值 $\geq$ 0xFF8
表示当前簇已经是本文件的最后一个簇, - FATEntry的值为 0xFF7, 表示它是一个坏簇
在1.44M软盘上
FAT 表以一种非常优雅的方式规范了文件数据的先后关系. 假设 $DIR\_FstClus$ 表示文件第 $0$ 簇 (扇区) 的位置, 第 $i$ 个表项 $vec[i]$ 表示文件数据的实际位置, 则文件第一扇区的位置为 $vec[DIR\_FstClus]$ , 且迭代地有, 第 $i+ 1$ 个表项的实际位置为