2008年1月15日星期二

FAT12文件系统基本格式(1.44M软盘)

FAT12文件系统基本格式(1.44M软盘)

FAT12是DOS时代就开始使用的文件系统,目前软盘上也一直在用。
引导扇区是软盘的第0个扇区,在这个扇区中有一个很重要的数据结构叫BPB(BIOS Parameter Block),下面是引导扇区格式,其中BPB_开头的属于BPB,以BS_开头的只是BOOT Sector的一部分,不属于BPB。

名称 开始字节 长度 内容 参考值
BS_jmpBOOT 0 3 一个短跳转指令 jmp Label_07c00H
nop
BS_OEMName 3 8 厂商名 'QingFeng'
BPB_BytesPerSec 11 2 每扇区字节数(Bytes/Sector) 0x200
BPB_SecPerClus 13 1 每簇扇区数(Sector/Cluster) 0x1
BPB_ResvdSecCnt 14 2 Boot记录占用多少扇区 ox1
BPB_NumFATs 16 1 共有多少FAT表 0x2
BPB_RootEntCnt 17 2 根目录区文件最大数 0xE0
BPB_TotSec16 19 2 扇区总数 0xB40[2*80*18]
BPB_Media 21 1 介质描述符 0xF0
BPB_FATSz16 22 2 每个FAT表所占扇区数 0x9
BPB_SecPerTrk 24 2 每磁道扇区数(Sector/track) 0x12
BPB_NumHeads 26 2 磁头数(面数) 0x2
BPB_HiddSec 28 4 隐藏扇区数 0
BPB_TotSec32 32 4 如果BPB_TotSec16=0,则由这里给出扇区数 0
BS_DrvNum 36 1 INT 13H的驱动器号 0
BS_Reserved1 37 1 保留,未使用 0
BS_BootSig 38 1 扩展引导标记(29h) 0x29
BS_VolID 39 4 卷序列号 0
BS_VolLab 43 11 卷标 'QingFeng'
BS_FileSysType 54 8 文件系统类型 'FAT12'
引导代码及其他内容 62 448 引导代码及其他数据 引导代码(剩余空间用0填充)
结束标志0xAA55 510 2 第510字节为0x55,第511字节为0xAA 0xAA55


紧接着引导扇区的是两个完全相同的FAT表,每个占用BPB_FATSz16(0x9)个扇区;
第二个FAT之后就是根目录区的第一个扇区,根目录区后面是数据区。
根目录区的位置:引导扇区占1个Sec,两个FAT表共18Sec,所以根目录区开始扇区号为19。
根目录区中由若干个目录入口(Directory Entry)组成,最多有BPB_RootEntCnt个,所以根目录区大小不固定。
每个Directory Entry占32字节。
饿死我了,下楼吃饭,回来 GO ON ....

王旭华 QingFeng Studio 科技创造自由 清风创造和谐
顶部
王旭华 (华子)
管理员
Rank: 9Rank: 9Rank: 9


UID 3
精华 0
积分 0
帖子 53
阅读权限 200
注册 2007-5-29
状态 离线

#2
使用道具
发表于 2007-10-6 10:55 资料 个人空间 主页 短消息 加为好友 QQ
一、基本数据分布

|--------------------| 2879扇区
| 数据区(长度不固定) |
|--------------------|-------
| 根目录区(长度不固定,需计算) |
| |19 扇区
|--------------------|-------
| | 18扇区
| FAT2 |
| |10扇区
|--------------------|-------
| | 9 扇区
| FAT1 |
| |1扇区
|--------------------|-------
| 引导扇区 |
|--------------------| 0扇区

可以看出,FAT1和FAT2紧紧接着引导扇区,每个FAT占9扇区,根目录又紧随其后,从第19扇区开始,但根目录区的大小则不固定,依赖于Directory Entry的数目,最多有BPB_RootEntCnt个。

每个Directory Entry占32字节,其结构如下:
名称 开始字节 长度 内容
DIR_Name 0 0xB 文件名8字节,扩展名3字节
DIR_Attr 0xB 1 文件属性
保留位 0xC 10 保留
DIR_WrtTime 0x16 2 最后一次写入的时间
DIR_WrtDate 0x18 2 最后一次写入的日期
DIR_FstClus 0x1A 2 此文件在数据区和FAT表中的开始簇号
DIR_FileSize 0x1C 4 文件大小


DIR_FstClus:对应了文件的第一个簇号,但需要注意的是:数据区的开始簇号是2,不是0和1,
为此,FAT中的前两个FAT项(0项和1项)不被使用,从第2个FAT项开始有效。

每个FAT项(FATEntry)长度位12Bit,即一个半字节,FAT表中每3个字节存放了2个FATEntry。
3 Bytes:
||||||||||字节3||||||||| |||||||||FATEntry2||||
||||||||||字节2||||||||| => |||||||||||||||||||||||||||||||| => |||||||FATEntry1||||||||||||||||||||||||||||||||||||||||||||FATEntry2||||
||||||||||字节1||||||||| |||||||FATEntry1||||||
FATEntry代表文件的下一个簇号,但如果其值大于等于0xFF8,则表示当前簇是文件的最后一个簇;
如果是0xFF7,则表示这是一个坏簇。

上面已经提到,FAT中第一个有效的FATEntry是2号,对应了数据区的开始簇号。
------------------------------
可以这样理解:FATEntry就是数据区对应簇的next字段,它使一个文件以链表结构存放在数据区各个不连续的簇中,而把"索引"放在FAT中。

没有评论: