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)