FAT32文件系统
相关数据结构
struct fat32_BootSector_t
fat32启动扇区结构体
struct fat32_BootSector_t
{
uint8_t BS_jmpBoot[3]; // 跳转指令
uint8_t BS_OEMName[8]; // 生产厂商名
uint16_t BPB_BytesPerSec; // 每扇区字节数
uint8_t BPB_SecPerClus; // 每簇扇区数
uint16_t BPB_RsvdSecCnt; // 保留扇区数
uint8_t BPB_NumFATs; // FAT表数量
uint16_t BPB_RootEntCnt; // 根目录文件数最大值
uint16_t BPB_TotSec16; // 16位扇区总数
uint8_t BPB_Media; // 介质描述符
uint16_t BPB_FATSz16; // FAT12/16每FAT扇区数
uint16_t BPB_SecPerTrk; // 每磁道扇区数
uint16_t BPB_NumHeads; // 磁头数
uint32_t BPB_HiddSec; // 隐藏扇区数
uint32_t BPB_TotSec32; // 32位扇区总数
uint32_t BPB_FATSz32; // FAT32每FAT扇区数
uint16_t BPB_ExtFlags; // 扩展标志
uint16_t BPB_FSVer; // 文件系统版本号
uint32_t BPB_RootClus; // 根目录起始簇号
uint16_t BPB_FSInfo; // FS info结构体的扇区号
uint16_t BPB_BkBootSec; // 引导扇区的备份扇区号
uint8_t BPB_Reserved0[12];
uint8_t BS_DrvNum; // int0x13的驱动器号
uint8_t BS_Reserved1;
uint8_t BS_BootSig; // 扩展引导标记
uint32_t BS_VolID; // 卷序列号
uint8_t BS_VolLab[11]; // 卷标
uint8_t BS_FilSysType[8]; // 文件系统类型
uint8_t BootCode[420]; // 引导代码、数据
uint16_t BS_TrailSig; // 结束标志0xAA55
} __attribute__((packed));
struct fat32_FSInfo_t
该扇区存储了FAT32文件系统的一些参考信息。
struct fat32_FSInfo_t
{
uint32_t FSI_LeadSig;
uint8_t FSI_Reserved1[480];
uint32_t FSI_StrucSig;
uint32_t FSI_Free_Count;
uint32_t FSI_Nxt_Free;
uint8_t FSI_Reserved2[12];
uint32_t FSI_TrailSig;
} __attribute__((packed));
FSI_LeadSig
FS info扇区标志符 数值为0x41615252
FSI_Reserved1
保留使用,全部置为0
FSI_StrucSig
FS_Info扇区的另一个标志符,数值为0x61417272
FSI_Free_Count
上一次记录的空闲簇数量,这是一个参考值
FSI_Nxt_Free
空闲簇的起始搜索位置,这是为驱动程序提供的参考值.
FSI_Reserved2 保留使用,全部置为0
FSI_TrailSig
FS_Info扇区结束标志,数值为0xaa550000
struct fat32_Directory_t
短目录项结构体。
struct fat32_Directory_t
{
unsigned char DIR_Name[11];
unsigned char DIR_Attr;
unsigned char DIR_NTRes;
unsigned char DIR_CrtTimeTenth;
unsigned short DIR_CrtTime;
unsigned short DIR_CrtDate;
unsigned short DIR_LastAccDate;
unsigned short DIR_FstClusHI;
unsigned short DIR_WrtTime;
unsigned short DIR_WrtDate;
unsigned short DIR_FstClusLO;
unsigned int DIR_FileSize;
} __attribute__((packed));
DIR_Name
目录项名称。前8bytes为基础名,后3bytes为扩展名
DIRAttr
目录项属性。可选值有如下:
ATTR_READ_ONLY
ATTR_HIDDEN
ATTR_SYSTEM
ATTR_VOLUME_ID
ATTR_DIRECTORY
ATTR_ARCHIVE
ATTR_LONG_NAME
DIR_NTRes
该项为Windows下特有的表示区域,通过该项的值,表示基础名和扩展名的大小写情况。该项的值为EXT|BASE
组合而成,其中,具有以下定义:
BASE:LowerCase(8),UpperCase(0) EXT:LowerCase(16),UpperCase(0)
DIR_CrtTimeTenth
文件创建的毫秒级时间戳
DIR_CrtTime
文件创建时间
DIR_CrtDate
文件创建日期
DIR_LastAccDate
文件的最后访问日期
DIR_FstClusHI
文件起始簇号(高16bit)
DIR_WrtTime
最后写入时间
DIR_WrtDate
最后写入日期
DIR_FstClusLO
文件起始簇号(低16bit)
DIR_FileSize 文件大小
struct fat32_partition_info_t
该数据结构为FAT32分区的信息结构体,并不实际存在于物理磁盘上。这个结构体在挂载文件系统时被创建,作为文件系统的超级块的私有信息的一部分。
struct fat32_inode_info_t
该结构体是VFS的inode结构体的私有信息部分的具体实现。
已知问题
对目录项名称的检查没有按照标准严格实现
当磁盘可用簇数量发生改变时,未更新FS_Info扇区
未填写目录项的时间字段
TODO
完全实现VFS定义的文件接口
性能优化