Fat文件系统是sd卡常用的一种文件系统类型,在电脑上,我们可以把sd卡格式化成exfat类型或者ntfs类型。在linux系统里,我们可以用mkfs.vfat /dev/mmcblk0把sd卡格式化成fat文件系统类型,容量大于512M的默认会格式化成fat32,就是32位,除了fat32,还有fat12,fat16。 Fat文件系统是以簇为基本单元管理的,什么是簇? 簇其实就是一连串的扇区,我们知道sd卡在格式化完后,通常一个sector为512字节,所以我们以常见情况假设一个sector为512字节,用winhex读sd卡的信息,可以看到,格式化完的fat32默认一个簇是8K,一个sector是512字节,也就是一个簇是16个sector,所以簇的本质其实就是一串扇区。Fat文件系统限制了最大簇为32K。
Fat(file allocation table)
Fat文件系统有2个隐藏文件,就是fat1和fat2,这两个文件内容是一样的,fat2是fat1的备份。 如何阅读fat表? Fat表里4个字节为一个fat项,fat项的内容为下一个簇的簇号,所以fat表其实就是一个簇链。其中,fat表的第0项和第1项是固定值,根目录为第2项。关于fat表的值的含义:
Fdt
理解fdt对我们来说十分重要。从下面表格可以看到fdt表的内容,一个fat占32字节,其中包括簇号和文件名。在代码里对应的结构体是msdos_dir_entry
代码语言:javascript复制struct msdos_dir_entry {
__u8 name[MSDOS_NAME];/* name and extension */
__u8 attr; /* attribute bits */
__u8 lcase; /* Case for base and extension */
__u8 ctime_cs; /* Creation time, centiseconds (0-199) */
__le16 ctime; /* Creation time */
__le16 cdate; /* Creation date */
__le16 adate; /* Last access date */
__le16 starthi; /* High 16 bits of cluster in FAT32 */
__le16 time,date,start;/* time, date and first cluster */
__le32 size; /* file size (in bytes) */
};
簇号十分重要,我们需要通过簇号找到对应的扇区。除此之外,fdt还跟inode,dentry这些信息要关联起来。 介绍完fat文件系统两大基石:fat和fdt,下篇介绍fat文件系统查找,删除文件。