2024年1月14日发(作者:)

硬盘信息的存储方式

1.硬盘的物理扇区和逻辑扇区

物理扇区采用了cylinder/head/sector的存储方式。

逻辑扇区抛弃了c,h,s的物理概念认为硬盘存储区域是由一些列连续扇区组成。一般是把(0,0,1)作为逻辑第一个扇区。

物理扇区和逻辑扇区的转换:

NH 硬盘的head数

NS 每head的sector数

LS 逻辑扇区

C1 第一个逻辑扇区的柱面数

H1 第一个逻辑扇区的磁头数

对于物理扇区为(C,H,S)其逻辑扇区为对于逻辑扇区为LS其物理扇区

C=(LS/NS)/NH+C1

LS=NH*NS*(C-C1)+NS*(H-H1)+S-1

S=(LS mod NS)+1

H=(LS/NS)mod NH+H1/为整除,mod为整除取余

2.硬盘在dos(windows)下数据信息

2.1 fat文件系统

2.1.1MBR(Master Boot Record)

位于整个硬盘的(0,0,1),用于硬盘启动时将系统控制权交给指定的操作系统区。其结构如下

主引导程序(446 bytes)

分 分区项1(16 bytes)区 分区项2

分区项3

息分区项4

结束标志(55AA)

对于硬盘的分区表(DPT)它位于每一个分区起始扇区的446-500这64个字节。对于每一个16字节的分区项其结构为:

typedef struct PARTITIONTABLE

{

BYTE PartionID;//分区类型 1 byte

BYTE StartCHS[3];

BYTE SystemID; //分区操作系统类型 1

BYTE EndCHS[3];

DWORD RelativeSectors; //该分区起始逻辑扇区 4

DWORD TotalSectors;//分区总扇区数 4

}PARTITIONTABLE;

对于3个字节的StartCHS和EndCHS标明了该分区的起始(结束的)cylinder/head/sector,

分区的起始地址(面/扇区/磁道)和结束地址(面/扇/道)中字节分配:

00000000 01000001 00010101

~~~~~~~~ ==^^^^^^ ========

~ 面(磁头) 8 位

^ 扇区 6 位

= 磁道 10 位

对于分区类型常用有如下值:

0xb fat32;

0xc fat32_e;

0x6 fat16;

0xe fat16_e;0x7 ntfs;

2.1.2 DBR(Dos Boot Record)

位于此分区的逻辑0扇区(相对于整个分区,一般是(x,1,1)),也就是分区表中具体的开始扇区。主要用于此分区操作系统的引导。其结构如下:#pragma pack(1)

//如果此分区为fat16文件系统

struct FAT16_BOOT_SECTOR

{

BYTE Jumpto[3]; // {0EBH, 03CH, 090H};

BYTE OemID[8]; // "MSDOS5.0"

BYTE SecInByte; // dw 200H ; 扇区字节数

BYTE SecPerClr ; // db 00H ; 每簇扇区数

WORD ResClr; // dw 0001H ; 保留簇数BYTE NumOfFat; // db 02H ; FAT数

WORD RootEntry; // dw 512 ; 根目录数

WORD TotalSec; // dw 0000H ; 总扇区数 unused

BYTE FormatID; // db 0F8H ; 磁盘格式代号

WORD SecPerFat; // dw 0000H ; 每FAT扇区数

WORD SecPerTrk; // dw 003fH ; 每磁道扇区数

WORD Sides; // dw 0000H ; 磁盘面数

DWORD Hsector; // dd 003fH ; 隐藏扇区数

DWORD BigTotalSec; // dd 00000000H ; Big total number of sectors

BYTE Signature; // db 029H ; Extended Boot Record Signature

DWORD Serialnum ; // dd 015470ff4h ; Volume Serial Number

WORD Phydrvnum; // dw 0080H ; physical drive numberBYTE DISKLabel[11]; // BYTE "DISK1_VOL1 "

BYTE FileSystem[8]; // BYTE "FAT16 "

};

//如果此分区fat32文件系统。

struct FAT32_BOOT_SECTOR

{

BYTE Jumpto[3];//3

BYTE OemID[8]; //11

WORD SecInByte;//13

BYTE SecPerClr;//14

WORD ResClr;//16

BYTE NumOfFat;//17

WORD Reserved;//19

WORD Reserved1;//21

BYTE FormatID; //22

WORD SecPerFat;//24WORD SecPerTrk;//26

WORD Sides;//28

DWORD Hsector;//32DWORD BigTotalSec;//36DWORD BigSecPerFat;//40

BYTE Free[23];//

WORD Phydrvnum; //

BYTE Free1;//

BYTE Signature;//

DWORD Serialnum;//

BYTE DISKLabel[11];//

BYTE FileSystem[8];

};

#pragma pack()

Dos引导扇区又称为BOOT区,主要完成dos/windows系统的自举。

2.1.3 文件分配表(File Allocate Table)

用于记录硬盘上面空间使用情况。

2.1.3.1 fat16文件系统

如果这个分区为fat16文件系统,那么紧跟DBR之后的扇区就是fat表开始的扇区,具体fat表有多少个扇区,在FAT16_BOOT_SECTOR结构的BigSecPerFat有记录。fat还有一

个备份,紧跟第一个fat表结束。

一些大的文件可能占用了很多簇,而且在磁盘上没有连续存放。FAT表就是为了确定文件每个簇的连接关系而设的。FAT表的每一项都对应着数据区的一个簇,FAT16的FAT表每一项占16位,也就是两个字节。每一项的内容表示其对应簇的分配情况,0表示尚未分配;FFF0h~FFF6h为备用;FFF7h表示坏簇,即该簇中磁盘有损坏;FFF8h~FFFF表示文件结束;其他值则表示当前簇的下一簇的簇号。

FAT表的最前面两项是不用的,因此第一个数据簇的簇号为2。FAT表第一个字节也是分区介质类型,和BPB中的一样。因此用"F8 FF FF"可以作为硬盘FAT起始的标志。

2.1.3.2 fat32文件系统

FAT32文件系统与FAT12/16的差别较大,一个主要的差别就是将根目录划归到数据区中了,在BPB中专门加了一项根目录开始簇号。这样根目录的大小就不再受到限制,大大增加了根目录的自由度。

对于fat32文件系统,fat表的位置在DBR后的第n个扇区,其中n为保留的扇区数。

FAT32与FAT12/16的另一不同点在于,FAT32既可以同时使用多个FAT表,也可以只使用其中的某一个FAT表。ExtFlags正是这个标志。当ExtFlags的第8位为0时表示同时使用每个FAT表,当其为1时表示只使用其中的一个FAT表,这个FAT表的序号由ExtFlags的低4位给出。

FAT32有个专门放BIGFATBOOTFSINFO结构的扇区,该结构包含了剩余簇个数,下一个空闲簇号等信息。这个扇区通常紧接着引导扇区。

FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。

如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。

2.1.4 文件目录表(File Directory Table)

对于fat16/32文件系统,用fdt 来表示整个硬盘文件存放的结构。

2.1.4.1 fat16的fdt

FAT16文件系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。

每个目录由连续的32个字符组成,包含了 : 该文件属性、日期 、首族号、长度等一些重要信息。具体的结构如下:

struct FAT16_DIRITEM{

BYTE fileName[8];

BYTE extName[3];

BYTE fileAttr;//文件属性

BYTE reserved[10];

WORD createDate;

WORD createTime;

WORD startClrNum;//start cluster num

DWORD fileSize;

};

fileAttr具体的取值如下:

00H 读写 01H 只读 02H隐含 04H系统 08H卷标 10H子目录 20H归档表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。 DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然在盘上,并没有被真正删除。

当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录2.1.4.2 fat32的fdt

根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。

目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义。

2.2

fat文件系统下硬盘数据的组织