本帖最后由 kenson 于 2010-2-22 12:23 编辑 8 h9 ]) `( z! ?! {8 C: d! S
0 T% I# U4 ?8 K B
我对硬盘MBR、DBR、BPB、FAT和FDT的理解(gliethttp) * B" N: e. G$ q) n# p0 ?8 l# G
文章来源:http://gliethttp.cublog.cn[转载请声明出处]' @4 V) c2 W6 l6 ?1 O
& ?6 m4 z+ ?! T1 @7 L& e, Y' ^
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
; \- [( F! I8 v2 `5 x硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽量提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数据。
$ r( F( ` ^- ~4 j j) y 硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。如果有N个盘片。就有2N个面,对应2N个磁头(Heads),从0、1、2开始编号。每个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。)每个盘片的划分规则通常是一样的。这样每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电机主轴为轴的柱面(Cylinders),从外至里编号为0、1、2……每个盘片上的每个磁道又被划分为几十个扇区(Sector),通常的容量是512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区。这三个参数即是硬盘的物理参数。 [摘自:《FAT文件系统原理》]
4 J5 r; C" Z) N+ m$ n7 G" E以下为我的理解(gliethttp)
% m) V! Z0 e2 [6 `) X7 ~Cylinders柱面个数为同心不同径的磁道个数' D1 _1 v$ l+ J! ?) y
Heads磁头个数为一个存放Cylinders个磁道的存储介质表面的面数6 @# w& s+ I t' i4 j4 A* i! M
Sector就是一个磁道上的扇区个数
; X$ ?2 {0 P5 \/ D, k2 J, V; S所以Cylinders×Heads×Sector就是这个物理硬盘的扇区总数.; k( u& T3 _; O, v. O
MBR->DPT/ H3 f/ ^* g* h& v
主分区1-->起始扇区DBR[包括BPB和扩展BPB]-->FAT1-->FAT2-->FDT-->数据区
& Z V( p- k7 v' \/ j主分区2-->下一个扩展分区信息描述+ n$ z' g7 _: w0 p$ W
主分区3
1 _8 m8 M6 c! j' G主分区4' S. x3 e1 N2 l/ w+ V( e) Q
MBR-->位于绝对的第0扇区" l8 E: M! r2 b ~! y- \
MBR的引导程序占了其中的前446个,紧接着的后64个字节是硬盘分区表DPT,最后2个字节是"55 AA",为磁盘有效结尾标志值& g( B! Q! {2 r" Y# r
[0x000~0x1BD]存放MBR--对于pc电脑bios执行完自举之后,会将cpu控制权交给此间的最大446个字节的loader程序$ M" G0 S- \2 a2 N2 f, V
[0x1BE~0x1FD]存放MBR--DPT硬盘分区表,每16个字节描述一个主分区,根据分区类型字节域,我们可以知道该分区类型! ]1 k# Z% x7 K( `
所以pc上主分区最多只能有4个.[gliethttp]
4 O3 @. g) U9 y$ n. }(注:DPT中对于>1字节的组合类型数据的存储,按小端模式[little endian]存储)
# L! V: D% B1 ]" r" B3 _' L几个常见的分区类型值:
' g) ?0 L" }2 ~1 g& }0x01 --- FAT328 L9 u$ s& r' L* m. q
0x04 --- FAT16<32M
^- K, w6 k% x$ u8 x6 G0x05 --- Extended(扩展分区)7 Z/ j7 Y6 V0 c4 p
0x06 --- FAT16 r, z2 b: l1 `3 L8 E
0x07 --- NTFS, \9 F8 G1 @! t4 e) U4 \! M. F
0x0B --- WIN95 FAT32
4 t8 r: \1 U2 S2 X6 V; P' J0x0C --- WIN95 FAT32
, L$ W5 V' L& S5 C) C, ?0x0E --- WIN95 FAT16$ ^ v. _0 s8 |, e' R8 d3 A
0x0F --- WIN95 Extended>8GB
0 r2 g o4 v6 l8 G- W: f3 p, U% X0x11 --- Hidden FAT12
! P/ z+ j6 r7 L% b2 ]0 {- j0x14 --- Hidden FAT16<32GB, r5 ?: `$ M' I1 h) u0 f
0x16 --- Hidden FAT167 D/ K7 Z% W1 s: G
0x17 --- Hidden NTFS
/ n! j# t+ V. Q3 x7 Y0x1B --- Hidden FAT32+ R" k* [5 t$ g
0x82 --- Linux swap) ^" r! s, Q1 n( \: o
0x83 --- Linux
# Q- y! b% S% L" k6 E& ~0x85 --- Linux extended" V- N/ {$ ]/ B' t6 l. |* C# L& U8 g2 Q# N
0xA6 --- Open BSD) @9 l5 S4 F$ w9 t( k3 Y
pc执行完bios之后,将cpu控制权交给MBR的前446个字节的loader程序,位于MBR中的loader程序会加载活动主分区对应的DBR区,即—操作系统
# g: [" j9 W$ h$ B. V$ E& i启动程序,之后MBR将cpu控制权交给DBR,所以DBR的第1个扇区的前3个字节必须对应x86的跳转指令”E8 58 90”,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。& N! i+ t$ h4 `. p0 k
DBR位于当前分区的起始扇区,比如c盘的第1个起始扇区地址,就是c盘对应的DRB区,0 v b" {* A5 }- e, t
同样D盘的第1个起始扇区地址,就是D盘对应的DBR区,
9 b5 t2 {/ q( o; o# w) s对于usb盘,也一样,usb的第1个起始扇区就是该U盘的DBR区
* E% U' r, A: k: U# {DBR的BPB区域描述本分区的大小,起始、终止磁盘、柱面、扇区号以及细分内容:fat的个数、每扇区字节数、
6 ]0 d$ K) Y2 n每簇扇区数、当前分区保留扇区数、根目录FDT项数、本分区对应的存储介质类型、每个fat需要的扇区数、4 A+ s$ I" F& l4 |
总扇区数、根目录FDT簇号等3 j2 v# ]) O0 u& l* q
BPB地址 ---0x0B~0x40$ A5 s, I% h' q; u" b/ w% n
扩展BPB地址 ---0x40~0x57
3 g! f6 Z$ u- a& N$ M- a- N还记得前面提到的x86跳转指令”E8 58 90”吧,这个指令翻译过来就是从指令处开始向后跳转几个字节到0x5A处继续执行程序,
; W3 Z5 T3 C% B+ x; ~所以DBR的0x5A处开始存放了windows操作系统的引导代码,DBR扇区的最后两个字节一般存储值为0x55AA的DBR有效标志,
% N1 D2 ^5 |& K. t2 Z3 M5 f) T' @如果是其他值,系统将不会执行DBR中的操作系统引导代码.
$ Y# E9 F- j/ c9 N% c; t还有一个知识点,就是“保留扇区”(也叫“隐藏扇区”或“系统扇区”),“保留扇区”指从管理本逻辑磁盘,如C盘:D盘:U盘等的DBR/ s8 Z, A! F0 f) U5 }
扇区开始的供当前逻辑盘使用的用来描述本逻辑盘信息或者操作系统启动代码之类数据的扇区总数.
& f, _) x/ `/ g' [! u/ i. X7 k5 U对于DBR管理的当前分区,如:C盘、D盘等来说,DBR所在的扇区为相对于当前分区的0扇区,
- t8 N/ ? l& J8 j2 |' V8 _. h所以使用winhex,打开整个硬盘时, 看到的是该硬盘的绝对地址[gliethttp]
, ~7 f" ]; D( z即:第0扇区为MBR,第63扇区为C盘的DBR,对于我的硬盘还有D、E和F
) {+ }, }5 A: N& G5 QC盘:分区表DPT---0扇区 ,它对应的DBR扇区---DPT+63=63扇区
) y2 ]& N k4 k0 b9 ?D盘:分区表DPT---81931500扇区(无用) ,它对应的DBR扇区---DPT+63=81931563扇区
& V0 e* \7 U( o" M$ qE盘:分区表DPT---163863000扇区(无用),它对应的DBR扇区---DPT+63=163863063扇区 g2 R& N7 X" T
DBR又叫做该分区盘的起始扇区,在绝对地址下, 该分区盘的DBR就是绝对偏移扇区值,: L9 F% o( p( q3 M9 R1 P
使用winhex打开该分区盘(如D盘)之后,DBR在该分区盘(如D盘)内部的相对扇区值为0,
9 j0 o; J# D' L. P, n/ j* `8 C2 d我的硬盘中[gliethttp]# @; m3 k: d2 W9 A ~, ]& f+ B+ j
C盘的DBR相对扇区为0
2 r- \, @7 M1 @2 E3 m& z( E- AC盘的FAT1相对C盘的扇区偏移值为34- T; G( Q V, }6 f- x2 H
D盘的DBR相对扇区为0
- |+ {% b' c6 ?3 g U9 nD盘的FAT1相对D盘的扇区偏移值为34
4 c' v3 r" J/ v( o4 B t) b7 n1 zE盘的DBR相对扇区为0+ t6 k3 h, [1 H# o" f. K1 c
E盘的FAT1相对E盘的扇区偏移值为38
6 y/ I5 F7 `% I8 P9 nU盘的DBR相对扇区为09 a: s* _: a/ H/ `
U盘的FAT1相对U盘的扇区偏移值为362 k9 ^1 b0 b1 @! [8 O5 M: ]
以上这些偏移值都在每个分区盘的DBR中的BPB里有描述.! `" j% w6 e4 `, ~1 \' U+ h# r& p
http://blogimg.chinaunix.net/blog/upfile/070920165541.jpg(winhex操作图例1)http://blogimg.chinaunix.net/blog/upfile/070920165624.jpg(进入C盘之后,DBR即起始扇区为相对地址0) http://blogimg.chinaunix.net/blog/upfile/070920165656.jpgwinhex操作图例2http://blogimg.chinaunix.net/blog/upfile/070920165624.jpg(进入D盘之后,DBR即起始扇区为相对地址0) 虽然进入D盘或E盘等分区盘之后使用winhex打开的“起始扇区(模板)”的DBR相对地址不一样,但实际上都是指向同一个绝对物理地址,. t+ |; e* V- b x! V5 W/ I# T! e
DBR的内容都是一样的. 对于存在扩展分区的硬盘,比如我的硬盘有C、D、E和F共4个盘符, ?' B4 ?, W B4 n" X( B
那么C盘将真正的使用硬盘的MBR,对于扩展分区是如何被系统识别的,以及他们之间是如何串联起来的,
2 Y+ q8 O! n" M4 V有这样一个规定,使用MBR的第2个主分区作为下一个扩展分区相对与本分区的偏移扇区描述体
) N7 B5 {( w, t1 @! c& X那么如果在扩展分区中,也没有MBR啊,是的,所以我们虚拟出一个MBR,认为下一个扩展分区是一个虚拟的物理硬盘,它也存在MBR# H2 g+ @) m- b
这样在虚拟MBR中只需要填写第2个主分区,即这个扩展分区对应的下一个扩展分区的偏移扇区描述体即可,这样循环下去.
$ b) ^# Y! _5 z" i1 D http://blogimg.chinaunix.net/blog/upfile/070920165906.jpg http://blogimg.chinaunix.net/blog/upfile/070920165925.jpg http://blogimg.chinaunix.net/blog/upfile/070920165953.jpg |