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文件系统下硬盘数据的组织


发布评论