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
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文件系统查找,删除文件。
号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。
如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】
一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~