fatfs
fatfs include fat16 and fat32. fat16 has the limit that the file name is 8.3 and the biggest file size is 2G.
refence site
https://www.pjrc.com/tech/8051/ide/fat32.html
http://www.c-jump.com/CIS24/Slides/FAT/lecture.html
http://blog.sina.com.cn/s/blog_67692a840100n3i5.html
https://blog.csdn.net/xiaobai32966/article/details/45074841
MBR
启动扇区为第一个扇区,由于历史原因或是实现操作系统的不同,导致很多定义出现了差异,目前必须保留的字段如下,具体的系统级别差异后续分析
Field | Microsoft’s Name | Offset | Size | Value |
---|---|---|---|---|
Bytes Per Sector | BPB_BytsPerSec | 0x0B | 16 Bits | Always 512 Bytes |
Sectors Per Cluster | BPB_SecPerClus | 0x0D | 8 Bits | 1,2,4,8,16,32,64,128 |
Number of Reserved Sectors | BPB_RsvdSecCnt | 0x0E | 16 Bits | Usually 0x20 |
Number of FATs | BPB_NumFATs | 0x10 | 8 Bits | Always 2 |
Sectors Per FAT | BPB_FATSz32 | 0x24 | 32 Bits | Depends on disk size |
Root Directory First Cluster | BPB_RootClus | 0x2C | 32 Bits | Usually 0x00000002 |
Signature | (none) | 0x1FE | 16 Bits | Always 0xAA55 |
注:
簇(cluster) === 是多个扇区的集合,是文件分块的最小单位,第一个簇的编号是2,没有0,1编号。
扇区(sector) == 是多个字节的集合
上图解析:
- 每个扇区字节数:0x0200 = 512
- 每个簇的扇区数:0x10 = 16
- 每个簇的字节数:512 × 16 = 8192
- 保留的扇区数: 0x22 = 34 (包括启动扇区)
- FATS 个数:0x02
- 每个FAT扇区数:0x3bd7=15319
- 根目录的簇号:0x02
DISK Layout
由MBR分析出各区间地址
- 启动扇区: 0x00000000 - 0x000001FF
- 保留扇区: 0x00000200 - 0x000043FF
- FAT1 : 0x00004400 - 0x0077F1FF
- FAT2 : 0x0077F200 - 0x00EF9FFF
- 第2簇 : 0x00EFA000 -0x00EFBFFF
- 第3簇 : 0x00EFC000 -
注意:数字为第几个扇区
FAT
FAT 文件分配表:
一个分区分成同等大小的簇,也就是连续空间的小块。簇的大小随着FAT文件系统的类型以及分区大小而不同,典型的簇大小介于2KB到32KB之间。每个文件根据它的大小可能占有一个或者多个簇;这样,一个文件就由这些这些(称为单链表)簇链所表示。然而,这些链并不一定一个接着一个在磁盘上存储,它们经常是在整个数据区域零散的储存。
文件分配表(FAT)是映射到分区每个簇的条目列表。每个条目记录下面五种信息中的一种。
- 链中下一个簇的地址
- 一个特殊的文件结束符(EOF)符号指示链的结束
- 一个特殊的符号标示坏簇
- 一个特殊的符号标示保留簇
- 0来表示空闲簇
每个版本的FAT文件系统使用不同大小的FAT条目。这个大小已经由名字表示出来,例如FAT16文件系统的每个条目使用16位表示,32位文件系统使用32位表示。这个不同意味着FAT32系统的文件分配表能比FAT16映射更多的簇,它也允许FAT32有更大的分区大小。这也使得FAT32比FAT16更能有效地利用磁盘空间,因为每个驱动器能够寻址更小的簇,这也就意味着更少的空间浪费。
FAT条目值:
FAT12 | FAT16 | FAT32 | 描述 |
---|---|---|---|
0x000 | 0x0000 | 0x?0000000 | 空闲簇 |
0x001 | 0x0001 | 0x?0000001 | 保留簇 |
0x002 - 0xFEF | 0x0002 - 0xFFEF | 0x?0000002 - 0x?FFFFFEF | 被占用的簇;指向下一个簇 |
0xFF0 - 0xFF6 | 0xFFF0 - 0xFFF6 | 0x?FFFFFF0 - 0x?FFFFFF6 | 保留值 |
0xFF7 | 0xFFF7 | 0x?FFFFFF7 | 坏簇 |
0xFF8 - 0xFFF | 0xFFF8 - 0xFFFF | 0x?FFFFFF8 - 0x?FFFFFFF | 文件最后一个簇 |
注意FAT32只使用32位中的28位。高4位通常是0但它们是保留位,不要更改它们。在上面的表中它们用问号表示。
root directory
根目录是第2个簇,目录结构如下:
FAT32:每个文件或文件夹32个字节
具体:
如上图:
第1个字节如果是E5,表示删除,黄色为文件,红色为删除文件。