1. 磁盘的逻辑结构:
1) 盘片(platter) 一个盘片两个面, 一个面一个磁头, N个盘片2N个面, 2N个磁头(heads).
2) 柱面(Cylinders) 每个盘片被划分为若干个同心圆磁道(物理上不可见), 从外至里编号0、1、2......
3) 扇区(Sector) 通常的容量为512byte, 并按照一定规则编号1、2、3...... 总共扇区有heads*Cylinders*Sector
2. FAT16存储原理:
主引导扇区 | 系统引导扇区 | FAT1 | FAT2(备份) | 根目录 | 其他文件及所有文件 | 剩余扇区 |
1扇区 | 1扇区 | 实际情况 取大小 | 同FAT1 | 32个 扇区 | 开始簇编号(从2开始) | 不足一簇 |
1)主引导纪录 MBR (marst boot record) 位于0柱面0磁头1扇区, 占512byte, 包括启动代码和分区表, 其中master boot code占446byte, DPT(Disk Partition Table)占64byte, 最后两个字节(55 AA==101010110101010)是分区有效结束标志
磁盘分区表支持我们将磁盘逻辑的划分为几块(C盘, D盘, E盘, F盘).
每16byte纪录一个分区的属性.
扩展分区:
扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导纪录(Extended Boot Record, EBR)
扩展引导纪录包括一个扩展分区表和该扇区的标签.
2)系统引导扇区(DBR) 用于指示文件分配表的位置、大小、个数和根目录位置、大小、项数.
主引导纪录 |
第1分区表项 |
第2分区表项 |
第3分区表项 |
第4分区表项 |
0x55AA |
引导扇区 |
数据
|
引导扇区 |
数据
|
引导扇区 |
数据
|
扩展分区表 |
0x55AA |
引导扇区 |
数据
|
扩展分区表 |
0x55AA |
引导扇区 |
数据
|
3)文件分配表(FAT File Allocation Table)
有两份, 第二份作为备份, 是分区信息的映射表, 指示簇是如何存储的.
FAT16以16位(2个字节)为单位, 暂称之为FAT纪录项, 通常情况下第1、2个纪录项(前4个字节)用作介质描述. 第3个纪录项开始记录除根目录外的其他文件和文件夹的簇链情况.
FAT16纪录项的取值 | 对应簇的表现情况 |
0000 | 未分配的簇 |
0002~FFEF | 已分配的簇 |
FFF0~FFF6 | 系统保留 |
FFF7 | 坏簇 |
FFF8~FFFF | 文件结束簇 |
簇(cluster): 微软操作系统中磁盘文件管理的最小单位, 本意是"一群", "一组", 即一组扇区, 扇区的单位实在太小(512byte), 故把它们捆绑起来组成一个更大更方便进行灵活管理的簇. 通常可以是2、4、8、16、32或64个扇区.
一个文件至少需要一个簇且一个簇中最多容纳一个文件, 即使该文件大小为0
eg.
磁盘存储状态:
文件分配表 | 目录 | A.TXT | D.TXT | C.TXT | D.TXT | 空 |
第0簇 | 第1簇 | 第2~11簇 | 第12~65簇 | 第66~86簇 | 第87簇~93簇 | 第94簇~99簇 |
文件分配表:
簇号 | 1 | 2 | 3 | ... | 11 | 12 | 13 | ... | 65 | 66 | 67 | ... | 86 | 87 | 88 | ... | 93 | 94 | ... | 99 |
对应数据 | 目录 | 3 | 4 | ... | FF | 13 | 14 | ... | 87 | 67 | 68 | ... | FF | 88 | 89 | ... | FF | 00 | ... | 00 |
目录:
A.TXT | 2 | 10 | 2004.3.22 10:41 | 2004.3.22 10:41 | 只读 |
|
|
|
|
|
|
|
|
C.TXT | 66 | 20.5 | 2000.3.8 21:11 | 2005.3.6 9:11 | 系统 |
|
D.TXT | 12 | 60.3 | 1999.5.1 8:00 | 2003.3.20 14:00 | 存档 |
|
|
|
| 。 。 。 |
|
|
|
|
|
|
|
|
|
|
(该目录非FAT系统, 仅作为例子参考)
FAT(16)的精髓思想即允许文件的不连续性, 以File Allocation Table来确定各文件所占有的簇, 即从第5个字节(前2*16位作为介质描述), 每2个字节为单位作为纪录项记录文件的分配. 可参考上图和原理.
FAT16的目录项32byte----定义如下:
表11 FAT16目录项32个字节的表示定义 | |||
字节偏移(16进制) | 字节数 | 定义 | |
0x0~0x7 | 8 | 文件名 | |
0x8~0xA | 3 | 扩展名 | |
0xB | 1 | 属性字节 | 00000000(读写) |
00000001(只读) | |||
00000010(隐藏) | |||
00000100(系统) | |||
00001000(卷标) | |||
00010000(子目录) | |||
00100000(归档) | |||
0xC~0x15 | 10 | 系统保留 | |
0x16~0x17 | 2 | 文件的最近修改时间 | |
0x18~0x19 | 2 | 文件的最近修改日期 | |
0x1A~0x1B | 2 | 表示文件的首簇号 | |
0x1C~0x1F | 4 | 表示文件的长度 |
FAT12、FAT16、FAT32的区别在于: 纪录簇链的二进制位数各为12位, 16位和32位.
32位二进制簇链决定了FAT最大可以寻址2T(2^32)个簇. 故即使簇的大小为1扇区, 理论上依然能寻址1TB范围内的分区.
2011-04-13 15:54:10