fat32文件系统的磁盘布局
FAT文件系统把存储介质看成是由簇(cluster)组成的数组。
注:簇是FAT和NTFS文件系统里的最小单位。块是EXT2和EXT3文件系统里的最小单位。扇区是磁盘里的最小单位。
fat32的整体结构
FAT文件系统=保留扇区 + 文件分配表 + 目录和数据区
保留扇区
引导记录
引导记录大小是1个扇区,位置是所在分区的0号扇区。
引导记录=BIOS参数块(0x00-0x23) + 扩展引导记录(0x24-0x1ff)
1 | pub(crate) struct BootSector { |
FSInfo扇区
1 | // FSInfo结构体占用512字节,扇区号在扩展引导记录里指定。 |
文件分配表
文件分配表里的一个表项就是一个32位的簇地址,表项的数量就是当前分区里的簇数量。
FAT32使用32位地址来给簇编号,但高4位被保留了,只有低28位是有效的。
- 0号表项是被保留的。其值必须是
0xf8ff_ff0f
。 - 1号表项是被保留的,留做将来使用。其值必须是
0xffff_ffff
或0xffff_ff0f
。 - 目录和数据区是从2开始编号的。
文件分配表里元素值的含义:
- 大于等于
0x0fff_fff8
,代表没有多余的簇了,即整个文件已读取完成。 - 等于
0x0fff_fff7
,代表这个簇是坏的。 - 等于
0
,代表这个簇是空闲的。 - 等于
1
,没有意义。 - 其它值,代表了当前文件下一个簇的簇号。
目录和数据区
根目录
根目录在目录和数据区的第0号簇上,记录了整个磁盘的结构。是由目录条目组成的数组,数组元素为32字节大小。
目录和文件的条目
1 | // 标准8.3格式。大小32字节。 |
参考资料
- osdev.org/fat
- crates.io/fatfs
- 《操作系统的设计与实现 - 5.3.2实现文件》