1# FAT32文件系统
2
3## 简介
4
5  FAT32文件系统是一种相对简单的文件系统。
6
7  FAT32文件系统实现在`kernel/filesystem/fat32/`中。
8
9---
10
11## 相关数据结构
12
13### struct fat32_BootSector_t
14
15  fat32启动扇区结构体
16
17```c
18struct fat32_BootSector_t
19{
20    uint8_t BS_jmpBoot[3];    // 跳转指令
21    uint8_t BS_OEMName[8];    // 生产厂商名
22    uint16_t BPB_BytesPerSec; // 每扇区字节数
23    uint8_t BPB_SecPerClus;   // 每簇扇区数
24    uint16_t BPB_RsvdSecCnt;  // 保留扇区数
25    uint8_t BPB_NumFATs;      // FAT表数量
26    uint16_t BPB_RootEntCnt;  // 根目录文件数最大值
27    uint16_t BPB_TotSec16;    // 16位扇区总数
28    uint8_t BPB_Media;        // 介质描述符
29    uint16_t BPB_FATSz16;     // FAT12/16每FAT扇区数
30    uint16_t BPB_SecPerTrk;   // 每磁道扇区数
31    uint16_t BPB_NumHeads;    // 磁头数
32    uint32_t BPB_HiddSec;     // 隐藏扇区数
33    uint32_t BPB_TotSec32;    // 32位扇区总数
34
35    uint32_t BPB_FATSz32;   // FAT32每FAT扇区数
36    uint16_t BPB_ExtFlags;  // 扩展标志
37    uint16_t BPB_FSVer;     // 文件系统版本号
38    uint32_t BPB_RootClus;  // 根目录起始簇号
39    uint16_t BPB_FSInfo;    // FS info结构体的扇区号
40    uint16_t BPB_BkBootSec; // 引导扇区的备份扇区号
41    uint8_t BPB_Reserved0[12];
42
43    uint8_t BS_DrvNum; // int0x13的驱动器号
44    uint8_t BS_Reserved1;
45    uint8_t BS_BootSig;       // 扩展引导标记
46    uint32_t BS_VolID;        // 卷序列号
47    uint8_t BS_VolLab[11];    // 卷标
48    uint8_t BS_FilSysType[8]; // 文件系统类型
49
50    uint8_t BootCode[420]; // 引导代码、数据
51
52    uint16_t BS_TrailSig; // 结束标志0xAA55
53} __attribute__((packed));
54```
55
56### struct fat32_FSInfo_t
57
58   该扇区存储了FAT32文件系统的一些参考信息。
59
60```c
61struct fat32_FSInfo_t
62{
63    uint32_t FSI_LeadSig;
64    uint8_t FSI_Reserved1[480];
65    uint32_t FSI_StrucSig;
66    uint32_t FSI_Free_Count;
67    uint32_t FSI_Nxt_Free;
68    uint8_t FSI_Reserved2[12];
69    uint32_t FSI_TrailSig;
70} __attribute__((packed));
71```
72
73**FSI_LeadSig**
74
75  FS info扇区标志符 数值为0x41615252
76
77**FSI_Reserved1**
78
79  保留使用,全部置为0
80
81**FSI_StrucSig**
82
83  FS_Info扇区的另一个标志符,数值为0x61417272
84
85**FSI_Free_Count**
86
87  上一次记录的空闲簇数量,这是一个参考值
88
89**FSI_Nxt_Free**
90
91  空闲簇的起始搜索位置,这是为驱动程序提供的参考值.
92
93**FSI_Reserved2**
94  保留使用,全部置为0
95
96**FSI_TrailSig**
97
98  FS_Info扇区结束标志,数值为0xaa550000
99
100### struct fat32_Directory_t
101
102  短目录项结构体。
103
104```c
105struct fat32_Directory_t
106{
107    unsigned char DIR_Name[11];
108    unsigned char DIR_Attr;
109    unsigned char DIR_NTRes;
110    unsigned char DIR_CrtTimeTenth;
111    unsigned short DIR_CrtTime;
112    unsigned short DIR_CrtDate;
113    unsigned short DIR_LastAccDate;
114    unsigned short DIR_FstClusHI;
115    unsigned short DIR_WrtTime;
116    unsigned short DIR_WrtDate;
117    unsigned short DIR_FstClusLO;
118    unsigned int DIR_FileSize;
119} __attribute__((packed));
120```
121
122**DIR_Name**
123
124  目录项名称。前8bytes为基础名,后3bytes为扩展名
125
126**DIRAttr**
127
128  目录项属性。可选值有如下:
129
130> - ATTR_READ_ONLY
131>
132> - ATTR_HIDDEN
133>
134> - ATTR_SYSTEM
135>
136> - ATTR_VOLUME_ID
137>
138> - ATTR_DIRECTORY
139>
140> - ATTR_ARCHIVE
141>
142> - ATTR_LONG_NAME
143
144**DIR_NTRes**
145
146  该项为Windows下特有的表示区域,通过该项的值,表示基础名和扩展名的大小写情况。该项的值为`EXT|BASE`组合而成,其中,具有以下定义:
147
148> BASE:LowerCase(8),UpperCase(0)
149> EXT:LowerCase(16),UpperCase(0)
150
151**DIR_CrtTimeTenth**
152
153  文件创建的毫秒级时间戳
154
155**DIR_CrtTime**
156
157  文件创建时间
158
159**DIR_CrtDate**
160
161  文件创建日期
162
163**DIR_LastAccDate**
164
165  文件的最后访问日期
166
167**DIR_FstClusHI**
168
169   文件起始簇号(高16bit)
170
171**DIR_WrtTime**
172
173  最后写入时间
174
175**DIR_WrtDate**
176
177  最后写入日期
178
179**DIR_FstClusLO**
180
181   文件起始簇号(低16bit)
182
183**DIR_FileSize**
184  文件大小
185
186### struct fat32_partition_info_t
187
188  该数据结构为FAT32分区的信息结构体,并不实际存在于物理磁盘上。这个结构体在挂载文件系统时被创建,作为文件系统的超级块的私有信息的一部分。
189
190### struct fat32_inode_info_t
191
192  该结构体是VFS的inode结构体的私有信息部分的具体实现。
193
194---
195
196## 已知问题
197
1981. 对目录项名称的检查没有按照标准严格实现
199
2002. 当磁盘可用簇数量发生改变时,未更新FS_Info扇区
201
2023. 未填写目录项的时间字段
203
204---
205
206## TODO
207
208- 完全实现VFS定义的文件接口
209
210- 性能优化
211
212---
213
214## 参考资料
215
216[FAT32 File System Specification - from Microsoft](http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/fatgen103.doc)