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