FAT12 文件系统

一、FAT12 Spec
http://www.disc.ua.es/~gil/FAT12Description.pdf

一些要点描述:
FAT12, "12"是指FAT的条目的长度为12bits

当使用FAT12作为软盘文件系统时:
扇区 
- 基本存储单位, 512 Bytes
簇 - 多个扇区组成簇, 对于软盘来说,一个簇中只有一个扇区

整个软盘的结构如下:
Boot Sector + FAT tables + Root Directory + Data Area

对于1.44MBytes的软盘来说,总共有2880个扇区
Boot Sector:位于0号扇区
FAT tables:  由FAT1/FAT2,其中FAT1和FAT2完全相同,共占2 * 9 =18扇区,从1 ~ 18号扇区
Root Directory: 目录结构区,共占14个扇区,从19 ~ 32号扇区,每条目录占32Bytes,这样,最大能支持14 *512 / 32 = 224个目录或文件
Data Area:数据区,共2861个扇区,从19 ~ 2879号扇区

二、Boot sector:结构分析
============================================================================================
Offset   Length    Defaultvalue           Data
============================================================================================
       11                                 name
11                  512                 Byte per sector
13                                     Sectors per cluster
14                                     Number of reserved sectors
16                                    Number of FATs
17                  224                  Maximum number of root directory entires
19                  2880                 Total sector count
21                  0xF0                 软盘类型,高密度,双面
22                                     Sectors per FAT
24                   18                  Sectors per track
26                                     Number of heads
28                                     Hidden sector count
32                                     Total sector count for FAT32 (0 for FAT12 and FAT16)
36                                     Number of driver
38                   0x29                Boot signature, which indicates the following three fields in theboot sector are present
39                                       Volume id
43       11            "NO NAME         Volume label
54                   "FAT12           File system type(e.g. FAT12, FAT16)
62       ...                                Data or Boot code
510                   0xAA55             Boot sector flag
============================================================================================
也就是说头部占用62Bytes

如何根据上面的结构计算FAT所在扇区位置:
FAT 起始扇区号 = 保留扇区个数 [28] + 隐藏扇区个数 [14]
FAT1 起始扇区号 = FAT 起始扇区号
FAT2 起始扇区号 = FAT 起始扇区号 + 每个FAT占用的扇区数 [22]

根目录起始扇区号 = FAT 起始扇区号 + 每个FAT占用的扇区数 [22] * FAT 个数 [16]
根目录占用扇区数 = 最大根目录条目数[17] * 32 / 每个扇区的字节数 [11]

数据起始扇区号 = 根目录起始扇区号 + 根目录占用扇区数

三、FAT 结构
Val                 Meaning
==================================
0x00                Unused
0xFF0-0xFF6         Reserved cluster
0xFF7               Bad cluster
0xFF8-0xFFF         Last cluster in a file
others              Number of the next cluster in the file
==================================
一个条目占12 比特
FAT表中的每一条对应一个数据区的一个簇号。。
譬如数据区起始扇区号=33
FAT表的头2个条目为保留
FAT表共有条目数= 每个FAT占用的扇区数 [22] * 每个扇区的字节数 [11] * 2 / 3 = 9 * 512 * 2/3 = 3 * 1024 = 3072

数据区起始扇区对应的FAT条目索引为2,即第3条条目,而该条目中的值则根据上表来解释。。
数据区的扇区号 = FAT表的索引号 - 2 + 33

四、根目录的结构
每条目录为32Bytes
============================================================================================
Offset   Length     Description
============================================================================================
                文件名  (如果第一个字节为0xE5,则表示该目录条未使用;如果第一个字节为0x00,则表示,该条目及后面所有的条目都没有被使用)
                文件扩展名
11                文件属性 (bit0 - readonly, bit1 - hidden, bit2 - system, bit3 - volumelabel, bit4 - subdirectory, bit5 - archive, bit6 - unused, bit7 -unused)
12                Reserved
14                创建时间
16                创建日期
18                最后访问日期
20                Igore in FAT12
22                最后写时间
24                最后写日期
26                起始簇号 (即对应的FAT表的索引号)
28                文件大小(字节为单位)
============================================================================================

注意:
文件名和文件扩展名都不包含NULL结束字符;

五、文件分配举例
三个文件
AAAA.txt   100 bytes
BBBB.txt   1400 bytes
CCCC      目录

ROOT[0].[26] = 3
ROOT[1].[26] = 2
ROOT[2].[26] = 5
FAT[0] = 0xFF8 -> 对应的为目录区
FAT[1] = 0xFFF
FAT[2] = 4 -> BBBB.txt (1) ->33号扇区
FAT[3] = 0xFF8 -> AAAA.txt ->34号扇区
FAT[4] = 6 -> BBBB.txt (2) ->35号扇区
FAT[5] = 0xFF8 -> 目录 -> 36号扇区
FAT[6] = 0xFF8 -> BBBB.txt (3) ->37号扇区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值