磁盘数据结构笔记.docx
《磁盘数据结构笔记.docx》由会员分享,可在线阅读,更多相关《磁盘数据结构笔记.docx(14页珍藏版)》请在冰豆网上搜索。
![磁盘数据结构笔记.docx](https://file1.bdocx.com/fileroot1/2023-1/24/9c7cf4d6-a6cc-44eb-a162-bad88714ad3a/9c7cf4d6-a6cc-44eb-a162-bad88714ad3a1.gif)
磁盘数据结构笔记
磁盘数据结构:
MBR
446
空闲
同左
引导扇区DBR
数据
Partitiongap
EBR扩展分区1
引导扇区DBR
数据
Partitiongap
EBR扩展分区2
引导扇区
数据
Unpartitionalspace
DPT
64
55AA
55AA
55AA
55AA
55AA
55AA
StartSectorsPartition1Partition2ExtendedPartition
系统保留C盘逻辑D盘逻辑E盘
第一分区表
第二分区表
第三分区表
第四分区表
当前分区
下一个分区
未用
未用
磁盘寻址:
1、物理寻址CHS(柱面磁头扇区)
2、逻辑寻址LBA
几个概念:
1、低级格式化:
对硬盘划分磁道和扇区,在扇区的地址域上标注地址信息(CHS物理地址),并剔出坏磁道。
2、分区:
允许整个物理硬盘在逻辑上划分最多4个主分区,如果想划分更多的分区,可将1个主分区划分成扩展分区,然后再将扩展分区划分成一个或多个逻辑盘。
3、MBR(MasterBootRecord):
硬盘上建立分区表的同时建立,排在最前边的一个扇区(可存放512字节)里,存放着用于硬盘正常工作的很重要代码,这些代码分三个部分:
一是用于启动硬盘的一些引导指令(即主引导程序MBR,446字节);二是分区表(DPT,64字节);三是硬盘正常的标志55AA。
4、EBR(ExtendedBootRecord)则是与MBR相对应的一个概念。
MBR里有一个DPT(DiskPartitionTable,磁盘分区表)的区域,它一共是64字节,按每16个字节一个分区表项,它最多只能容纳4个分区。
在MBR的DPT里说明的分区称为主分区,如果想分更多的分区,微软的解决方案:
在MBR里放不多于三个主分区(通常一个),剩下的分区则由EBR扩展分区引导记录(与MBR结构相像的分区结构)里说明。
一个EBR不够用时,可以增加另一个EBR,如此像一根根链条一样地接下去。
5、DBR(DOSBootRecord),就是每个逻辑盘的最前的一个扇区里,用于引导和加载相应文件管理系统的一些系统代码。
也称作操作系统引导扇区(OBR)
MBR:
主引导记录(CHS:
0柱0磁头1扇区)
00010203040506070809ABCDEF
EB
5E
00
00
00
00
00
00
00
00
00
00
00
00
00
00
02
00
00
00
00
00
00
00
3F
00
FF
00
00
00
00
00
00
00
00
00
80
00
00
00
00
00
00
00
00
00
00
00
……………………………………………………………………………………………………………………………………………………………………………
00
00
00
00
00
00
00
00
00
00
00
00
00
3F
00
00
3F
FF
3F
00
46
42
42
46
00
00
80
01
01
00
07
FE
FF
FF
3F
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
55
AA
分区表:
扇区倒数第五行,倒数第二个字节开始,64个字节
:
引导代码446字节(白字为PE启动标志):
分区表64个字节:
结束标志55AA
1
2
分区引导标志
起始
磁头号
3
4
5
6
7
8
9
10
11
12
13
14
15
16
起始
扇区
起始
柱面号
分区
类型符
结束
磁头号
结束
扇区
结束
柱面号
本分区之前使用的扇区数
本分区的总扇区数
引导标志:
80H表示活动分区;00H表示非活动分区。
分区类型符:
00H表示该分区未用;06H——FAT16基本分区;05H——扩展分区;0FH——(LBA模式)扩展分区
07H——NTFS分区;83H—— Linux分区;0BH——FAT32基本分区;0CH——(LBA模式)FAT32分区
扇区数:
要倒过来计算(如分区表上3F000000,实际计算时为0000003F,转换成10进制63)
FAT32分区结构
隐藏扇区
(不在分区总数内)
保留扇区(DBR中0E-0F字节)
FAT1
FAT2
根目录FDT
数据区
MBR
其他
DBR
1-5扇区
DBR副本
其余
DBR24-27字节
紧跟着FAT2
物理0扇区
逻辑0扇区
00
逻辑6扇区
00
FAT32以“F8FFFF0F”开始,可搜索计算保留扇区及FAT扇区数
可通过搜索根目录下文件或文件夹名,字符选ASCII/Codepage
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
EB
58
90
OEMID
每扇区字节数
每簇扇区数
保留扇区
10
FAT数
根目录项数
小扇区数
介质F8
总为0
每磁道扇区数
磁头数
当前分区前面的隐含扇区
20
分区大小扇区数
每FAT扇区数
扩展标志
系统版本
根目录在DATA区起始簇号
30
01
00
DBR备份扇区
保留
40
80
00
标签
分区序号
卷标
50
FAT32
引导程序开始
……
………………………………………………………………………………………………………………………………………………………………
1F0
55
AA
:
JUMP指令及OEMID:
BPB(BIOSParameterBlock,BIOS参数块):
引导程序:
MagicNumber(结束标志字)
重建FAT32的DBR需要这么几个参数:
保留扇区数、FAT表个数(通常为2)、每FAT扇区数、根目录簇号(通常为2号簇)、每簇扇区数、分区前隐含扇区数及分区大小扇区数(这两项可在该分区的分区表项中找到)
步骤1.通过搜索位于扇区偏移0字节处的"F8FFFF"寻找FAT表..进而确定文件系统类型(FAT16/32)..
步骤2.寻找根目录,来计算出FAT的大小(FAT1被破坏可用此方法)..及保留扇区数..
步骤3.计算簇大小..利用两个子目录的起始扇区号差和他们的簇号差..就可以得到簇的大小..
每簇扇区数=(分区大小扇区数-保留扇区-FAT扇区数×FAT表数)/(FAT扇区数×512字节/4)
步骤4.从分区表项得到隐含扇区数与分区大小.
文件系统扇区:
DBR后面一个扇区
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
52
52
61
41
00
00
00
00
00
00
00
00
00
00
00
00
……
………………………………………………………………………………………………………………………………………………………………
1E0
00
00
00
00
72
72
41
61
空闲簇数
下一个空闲簇簇号
1F0
00
00
00
00
00
00
00
00
00
00
00
00
00
00
55
AA
FAT表项:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
F8
FF
FF
F0
FF
FF
FF
FF
2号FAT项
3号FAT项
01
4号FAT项
4号FAT项
6号FAT项
7号FAT项
1、FAT表项由4个字节构成,从0开始编号,每个表项映射1个簇(编号即是簇号),0号1号表项系统占用,用户数据从2号表项开始;
2、如果文件占用多个簇,则第一个表项记录下一个表项的编号(即簇号),若文件结束了“0FFFFFFF”表示,“00000000”表示对应簇未使用;
3、定位FAT:
MBR分区表得到分区的起始扇区;分区的DBR的BPB参数得到保留扇区(偏移0E-0F)、FAT表个数(偏移10)、FAT表大小(偏移24-27);FAT1=分区起始扇区+DBR保留扇区,FAT2=FAT1+FAT表大小
4、也可搜索0号表项值“F8FFFF0F”定位FAT扇区
数据区:
由根目录+子目录+文件内容
5、数据区以簇为单位存储,根目录一般在2号簇,定位根目录=数据区起始扇区+每簇扇区数*2
6、根目录下的文件和目录都放在根目录区中,子目录下的文件和目录都放在子目录区中;
7、目录项分四类:
卷标目录项,“.”和“..”目录项,短文件目录项(8.3格式),长文件目录项
8、每个目录项占32个字节,记录着一个目录或文件(也可能多个目录项记录一个文件或目录);
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
文件主名
扩展名
属性
00
创建时分秒
创建年月日
访问年月日
起始簇号高位
修改时分秒
修改年月日
起始簇号低位
文件大小(字节)
时分秒和年月日的算法:
十进制值=时
十进制值=分
十进制值*2=秒
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
十进制值+1980=年
十进制值=月
十进制值=日
文件属性字节:
00-读写01-只读02-隐藏04-系统08-卷标10-子目录20-存档
NTFS分区结构
隐藏扇区
(不在扇区总数内)
元文件$BOOT
元文件$MFTMirr
数据区
根目录
元文件$FMT
数据区
剩余扇区
备份DBR
MBR
其他
DBR
启动代码
$MFT备份,仅4条MFT记录
INDX
所有文件FMT记录,FMT占2扇区
物理0扇区
BOOT占2簇
XP:
NTLDR
Win7:
bootmgr
占1簇
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
EB
52
90
4E
54
46
53
20
20
20
20
每扇区字节数
每簇扇区数
00
00
10
总为0
NTFS未使用为0
介质F8
总为0
每磁道扇区数
磁头数
隐含扇区数
20
NTFS未使用为0
空
分区扇区总数
30
$MFT的起始簇号(LCN)
$MFTMirr的起始簇号(LCN)
40
每MFT记录的大小(簇数)
每索引的大小(簇数)
卷标
50
检验和
引导程序开始
……
…………………………………………………………………………………………………………………………………………………………………
1F0
55
AA
重建NTFS的DBR需要的参数:
簇大小、隐含扇区数、分区扇区数、$MFT起始簇号、$MFTMirr起始簇号
步骤1.通过搜索$MFTMirr,利用80属性的起始VCN及分配大小来计算出簇大小(每簇的扇区数=$MFT分配大小÷所占簇数÷512)
步骤2.通过分区表得到隐含扇区数...分区大小(MBR表分区大小=DBR分区大小+1)
步骤3.通过$MFTMirr中的$MFT..Runlist得出$MFT的起始簇号
步骤4.通过$MFTMirr中的$MFTMirr..Runlist得出$MFTMirr的起始簇号
步骤5.如果分区表破坏,可以通过查找元文件$Bitmap,根据$Bitmap所占空间计算总扇区数(NTFS分区所占扇区=$Bitmap文件大小×8位/字节×每簇扇区数);通过$MFTMirr所在扇区、对应簇号,计算出DBR(逻辑0簇)所在扇区(也就是隐藏扇区数)。
关于MFT的重点概念:
1、NTFS文件系统用文件来记录所有信息,文件由属性组成,对应一条MFT记录(文件记录块),一个文件记录块固定大小为1K,占两个扇区;所有文件的MFT记录都有一个文件来管理(就是$MFT),也就是0号MFT记录所指向的文件。
2、元数据文件:
记录一些非常重要的文件系统数据,包括用于文件定位和恢复的数据结构、引导程序数据以及整个卷的分配位图等信息。
元文件不能直接访问的,MFT将开头的16个文件记录块保留用于这些元数据文件。
3、每个文件都有一条MFT记录,MFT记录由记录头和属性组成,一个文件可以有多个属性(属性头+属性),属性分常驻属性(ResidentAttr)和非常驻属性(NoResidentAttr);当文件的属性内容>700字节时,使用非常驻属性,将属性内容外挂到磁盘的其他位置,这些位置由数据运行runs片来描述。
4、不同属性相同的地方在于属性头,即要么常驻属性头要么非常驻属性头,不同属性的属性内容各不相同,在磁盘上的分布结构也不同,作用也不同。
MFT记录头
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
FILE
更新序列号偏移
固定列表大小
日志文件序列号LSN
10
序列号SN
硬连接数
第一个属性偏移
标志字节
文件记录实时大小(字节)
文件记录分配大小(字节)
20
基本文件记录中的文件索引号
下一个自由ID
0000
本MFT记录号
30
边界
MFT的使用标记
00
00
00
00
MFT30文件属性(属性头+属性体,6.5行)
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
30
00
00
00
属性长度(包含本头部)
10
属性标志
属性名长度
属性名偏移
标志
属性ID标志
属性体大小
属性头大小
索引
保留
20
父目录记录号
保留
序列号
文件创建时间
30
文件修改时间
MFT更改时间
40
最后一次访问时间
文件分配大小
50
文件实际大小
文件标志
用于EAS和重解析
60
文件名长度
命名空间
以Unicode方式标识的文件名
MFT80数据流属性(目录的话A0)
80H 属性 $DATA 容纳文件数据(未命名数据流),文件的大小一般指是未命名数据流的大小,没有长度限制,当它为常驻时,数据长度最小。
它的结构为属性头加上数据流,如果数据流太大,则标记为非常驻,以运行的方式索引到外部。
例如找一个MP3文件,从它的MFT 项中0x80属性中可以看到它一定是非常驻,它的运行所指向的一系列簇就是音乐文件数据流
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
80
00
00
00
属性长度(包含本头部)
属性标志
属性名长度
属性名偏移
标志
属性ID标志
10
簇流的起始虚拟簇号(VCN)总从0开始
簇流的结束虚拟簇号(VCN)
20
簇流列表的偏移
压缩单位大小
保留
为属性内容分配的空间大小字节数
30
属性内容实际占用的大小字节数
属性内容初始大小字节数
40
簇流列表(runlist)
……
属性标志:
00-长驻属性01-非常驻属性
标志(0C-0D):
0001-压缩文件4000-加密文件8000-系统文件
偏移:
相对于本属性头
簇流列表3140009601:
31后面字节0x40是簇流片段占用的簇数,后面3个字节0X019600是相对起始簇号
MFT结束标志:
FFFFFF
索引记录结构
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
I
N
D
X
更新序号偏移
更新序号的大小与排列
日志文件序列号LSN
该索引缓冲在索引分配中的索引VCN
索引入口的偏移(相对于0x18)
索引入口的大小(相对于0x18)
索引入口的分配大小(相对于0x18)
1
保留
更新序列号
更新序列排列(2S-2字节)
exFAT分区结构
隐藏扇区
(不在分区扇区总数内)
引导扇区
FAT
数据区(簇单位)
MBR
其他隐藏扇区
DBR
DBR副本
其余
DBR24-27字节计算FAT扇区数(长度)
位图文件
大写转换表
根目录
物理0扇区
分区表或DBR40-47字节
逻辑
0-11扇区
逻辑
12-23扇区
搜索偏移0“F8FFFF0F”确定FAT表起始扇区;
搜索“FFFF”确定起始位置,2号簇
搜索“00000100”,固定5836B,占1簇
紧接大写转换表文件,一般5号簇
逻辑0-11扇区:
0引导扇区,1-8扩展引导扇区,9OEM信息记录,10保留,11引导校验扇区;备份12-23扇区对应0-11扇区。
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
EB
76
90
OEMID
20
20
20
00
00
00
00
00
10
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
20
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
30
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
40
隐藏扇区数
分区扇区总数
50
FAT起始扇区号
FAT扇区数
首簇起始扇区号
分区总簇数
60
根目录起始簇号
卷ID
文件系统版本
卷标志
每扇区字节数
每簇扇区数
FAT数
介质描述
70
己用比例
保留
00
00
引导代码开始
……
………………………………………………………………………………………………………………………………………………………………
1F0
55
AA
0.每扇区字节数:
假设此处值为N,则扇区大小字节数为2的N次方,通常9
1.隐藏扇区数:
可以从分区表中查看,如果分区表破坏请按重建分区表操作
2.扇区总数:
可以从分区表查看
3.FAT起始扇区数:
通过搜索FAT表的头标志“F8FFFF0F”所在扇区-分区开始扇区号(相对于DBR,不包含隐藏扇区)
4.首簇起始扇区号:
虽然只有一个FAT,但该处值并不一定等于FAT表起始扇区+FAT大小扇区数,FAT表分配的空间与簇起始扇区之间可能会有未使用的扇区;簇位图文件一般占用数据区的第一个簇,所以首簇起始扇区号的计算通过找簇位图文件的开始位置,搜索“FFFF”找到簇位图文件的起始扇区-分区开始扇区
5.每簇扇区数:
假设此处为N,则簇大小为2的N次方簇。
位图文件之后就是大写转换表文件,大写转换表文件的内容是固定的,前4个字节是“00000100”,通过搜索这4个字节就能找到大写转换表文件的开始扇区,与簇位图文件起始扇区相减得到簇位图文件大小,再通过分析FAT表可知簇位图文件占用簇的个数,相除可得到每簇扇区数
6.根目录起始簇号:
簇位图文件总是开始于数据区的2号簇,通过分析FAT表可知簇位图文件占用簇的个数,簇位图文件之后是大写转换表文件,固定5836个字节,结合每簇扇区数可知大写转换表文件占用的簇的个数,而大写转换表文件之后就是根目录的开始
7.分区总簇数:
前面已经知道首簇起始扇区号,每簇扇区数;用数据区的总扇区数除以每簇扇区数,就是分区的总簇数了
8.FAT扇区数:
用分区的总簇数来计算FAT扇区数。
(分区总簇数+2)*4/512(取大于这个值的簇大小的整数倍,簇位图前保留0号、1号簇)