2024年2月7日发(作者:)
FAT12文件系统
1. 简介
FAT12是第一个FAT(File Allocation Table)文件系统,发布于1977年,直到现在依然在软盘上大量使用。
2. 软盘物理结构
软磁盘简称软盘,以3.5英寸小软盘为例,他是一张双面敷有磁性材料的圆形塑料薄片,封装在方形塑料盒内构成的永久性整体盘片。其结构如图1所示。
0
9
磁道
4
1
扇区
8
3
7
图1 软盘结构图
软盘各组成部分作用如下:
1) 读写槽:供驱动器中磁头从盘片上读写信息。
2) 写保护口:为保护磁盘上的重要信息不被篡改,可打开保护口,这是,CPU只能从磁盘上读取信息到内存,无法写入信息。
3) 中心孔:卡住盘片与主轴一起转动。
4) 磁道:许多同心圆轨迹称为磁道,信息被记录在磁道上。对于高密度盘每面分成80条磁道,编号0~79,最外面是0道,最里面是79道。
5) 扇区:高密度磁盘每条磁道分成18个扇形区域,每个扇区存放512字节信息。
3.5英寸高密度磁盘容量 = 2(面)× 80(磁道)× 18(扇区)× 512(字节)= 1.44MB
2
6
写保护口
5
中心孔
读写槽
3. FAT12文件系统结构
下面以一个根目录文件数为224的1.44MB软盘为例来说明FAT12文件系统结构。FAT12文件系统由引导扇区,两个相同的FAT表,根目录区和数据区组成。如图2所示。
2879
数据区
2847
33
32
根目录区
19
18
10
9
1
0
绝对扇区号
图2
由BIOS中断int0x13的参数可知我们读取软盘时,使用磁头号(0和1),柱面号(磁道号0~79),磁道扇区号(1~18)来读取软盘的内容,而文件系统使用绝对扇区号来访问磁盘,因此还要做一些必要的转换工作。其公式见图3,对应关系见表1。
绝对扇区号
磁头号
柱面号
磁道扇区号
0
0
0
1
1
0
0
2
2
0
0
3
绝对扇区号
18
商
余
绝对磁道号
&1(与1)
扇区号
图3 公式
表1 扇区对应关系
3
0
0
4
...
...
...
...
17
0
0
18
18
1
0
1
19
1
0
2
20
1
0
3
...
...
...
...
+1
>>1(右移一位)
柱面号
磁头号
磁道扇区号
14
FAT表2
FAT表1
引导扇区
9
9
1
扇区数
其中:图3中右移一位等同于除2,与1等同于判断奇偶,因为磁道扇区号从1开始计数所以需要加1操作。
3.1.引导扇区
软盘的第0个扇区,其中包括了一个非常重要的数据结构BPB(BIOS Parameter Block),引导扇区格式如表2所示,其中BPB_开头的域属于BPB,以BS_开头的域不属于BPB,只是引导扇区(Boot Sector)的一部分。
名称
BS_jmpBoot
BS_OEMName
BPB_BytsPerSec
BPB_SecPerClus
BPB_RsvdSecCnt
BPB_NumFATs
BPB_RootEntCnt
BPB_TotSec16
BPB_Media
BPB_FATSize16
BPB_SecPerTrk
BPB_NumHeads
BPB_HiddSec
BPB_TotSec32
BS_DrvNum
BS_Reserved
BS_BootSig
BS_VolID
BS_VolLab
BS_FileSysType
引导代码及其他
结束标志0xAA55
偏移
0
3
11
13
14
16
17
19
21
22
24
26
28
32
36
37
28
39
43
54
62
510
长度
3
8
2
1
2
1
2
2
1
2
2
2
4
4
1
1
1
4
11
8
448
2
一个短跳指令
这里的nop不可少
厂商名
每扇区字节数(Bytes / Sector)
每簇扇区数(Sector / Cluster)
Boot记录占用多少扇区
共有多少FAT表
根目录文件数最大值
扇区总数
介质描述符
每面扇区数
每磁道扇区数
磁头数(面数)
隐藏扇区数
如TotSec16是0,由他记录扇区数
int13的驱动器号
保留
扩展引导标记(0x29)
卷序列号
卷标
文件系统类型
引导代码和其他填充字符
表2 引导扇区格式
内容 值
jmp START
nop
'OEMName '
0x200
0x1
0x1
0x2
0xE0
0xB40
0xF0
0x9
0x12
0x2
0
0
0
0
0x29
0
'VolLab '
'FAT12'
引导代码
第510字节为0x55,第511字节为0xAA
0xAA55
3.2.FAT表
用来存储FAT项(FAT Entry),位于软盘的1~18扇区,FAT表共有两个,FAT2可以看做是FAT1的备份,他们通常是一样的。
3.3.FAT项(FAT Entry)
一个FAT项由12个位来表示,保存在FAT表中。一个FAT项代表一个簇,第0个和第1个FAT项从不使用,从第2个FAT项开始表示数据区的第一个簇。FAT项的值代表文件的下一个簇号,如果其值大于或等于0xFF8,则表示当前簇已经是该文件的最后一个簇了,如果其值为0xFF7,则表示她是一个坏簇。FAT项存储方式见图4。
偏移1
偏移3
偏移5
BYTE5高4位
BYTE5低4位
BYTE4高4位
偏移4
BYTE4低4位
BYTE3高4位
BYTE3低4位
BYTE2高4位
偏移2
BYTE2低4位
BYTE1高4位
BYTE1低4位
BYTE0高4位
偏移0
BYTE0低4位
图4 FAT项存储方式
FAT项0
FAT项1
FAT项2
FAT项3
读取FAT项的方法:有FAT项号x ,FAT项所在偏移地址y,可知y=3/2x-1/2(x为奇数),y=3/2x(x为偶数);又因为计算时只去y的模,所以可合并改写为y=3/2x即y=x+1/2x。这样可以得到一个非常简单的方法来取得FAT项值所在的偏移地址:有ax = x;mov dx, ax ;shr dx,
1;add ax, ax。
3.4.根目录区
位于FAT表之后,开始扇区号为19,他由若干个目录项(Directory Entry)组成,项最多有BPB_RootEntCnt个。根目录区的大小依赖于BPB_RootEntCnt,所以其长度不固定。根目录区中的每个项占用32字节格式如表3。
名称
DIR_Name
DIR_Attr
0x0
0xB
表3 根目录区格式
偏移(字节) 长度(字节) 描述
11
1
10
2
2
2
4
文件名8字节,扩展名3字节
文件属性
保留位
最后一次写入时间
最后一次写入日期
文件起始簇号
文件大小
DIR_Reserve 0xC
DIR_WrtTime 0x16
DIR_WrtDate
DIR_Fstclus
DIR_FileSize
0x18
0x1A
0x1C


发布评论