版主
![Rank: 7](static/image/common/star_level3.gif) ![Rank: 7](static/image/common/star_level2.gif) ![Rank: 7](static/image/common/star_level1.gif)
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
本帖最后由 kenson 于 2010-3-19 22:46 编辑 ) A/ l/ I' N1 X% U* P
- G; o+ c# N/ X1 b( y硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解!5 a" B, S3 G4 R: a
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一)。
8 t. E- l% |7 G: C
, l6 ^8 D. _. j MBR由三部分构成:
; D/ q5 Q9 c% V2 w5 f0 P0 f. A# \2 D 1.主引导程序代码,占446字节. e. \- e# }! w( y* v. M
2.硬盘分区表DPT,占64字节! P( F% U( F6 H. a7 J
3.主引导扇区结束标志AA55H
% I) c) R# i- x4 e9 m. E( [9 z 一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
1 H$ L2 y8 V6 ]6 B' r- `/ S 主引导代码实现下列功能:9 i+ c: j4 `9 J0 H, Z. H
1.扫描分区表查找活动分区;) R* I4 @' X! K+ L Q# q0 e' z$ y
2.寻找活动分区的起始扇区;
# w1 _5 O) M% s. p 3.将活动分区的引导扇区读到内存;3 ^. e0 f6 \: `( d, g% U
4.执行引导扇区的运行代码。/ V$ I/ G; K; D7 H
如果主引导代码未完成这些功能,系统显示下列错误信息:
+ Z& R! R# b! H Invalid partition table
8 Y. }8 }* P6 H7 T8 O Error loading operating system
7 I! s% J$ {% c, o; o/ Z( H) P$ Y Missing operating system
: w/ o( n* O2 y/ J" D二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(图二);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。在这里我们可以看出,硬盘的总分区数为什么不能大于4。其中可激活分区数不得大于3,扩展分区数不得大于1,当前活动分区数必须小于等于1。
; \/ q c3 R# j, f0 }+ m1 W! k" i) X0 J1 K9 L7 B, x0 _' F0 D E9 |4 u1 [
分区表的每一分区的第0个字节是自举标志,其值为80H时,表示该分区是当前活动分区,可引导,其值为00H时,表示该分区不可引导。; k# ^' u) ]' s3 ?
第4字节是分区类型(图三)。' U, k. T* a( H) k: x, M
/ D3 s3 `5 \0 o0 X" d" Z
! r( v u5 P6 r* G* H
每一分区的第1至第3字节是该分区起始地址。其中第1字节为起始磁头号(面号);第2字节的低6位为起始扇区号,高2位则为起始柱面号的高2位;第3字节为起始柱面号的低8位。因此,分区的起始柱面号是用10位二进制数表示的,最大值为2^10 = 1024,因逻辑柱面号从0开始计,故柱面号的显示最大值为1023。同理,用6位二进制数表示的扇区号不会超过2^6 - 1 = 63;用8位二进制数表示的磁头号不会超过2^8 - 1 = 255。每一分区的第5至第7字节表示分区的终止地址,各字节的释义与第1至第3字节相同。这里我们假设一种极端的情况:如果让第5至第7字节的所有二进制位都取1,就获得了柱面号、磁头号和扇区号所能表示的最大值,从而得到最大绝对扇区号为:
7 `8 m/ j, E3 }5 b1 [/ t 1024 × 256 × 63 = 16,515,072' |+ K, z$ \; y+ c
这个扇区之前的所有物理扇区所包含的字节数为:7 F$ I& O/ _- \! }4 H/ H
16,515,072 × 512Bytes ≈ 8.46×109Bytes = 8.46GB。
! _# C2 X; V) c, m: g3 I! Z% H 由此可知硬盘的容量设计为什么会有8.4GB这一档,分区表每一分区的第1至第3字节以及第5至第7字节的数据结构已经不能满足大于8.46GB的大容量硬盘的需要。考虑到向下兼容的需要,业界并未对从DOS时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的面太广,会造成硬件和软件发展上的一个断层,几乎无法被业界和用户所接受。硬盘厂商解决这一问题的方法是定义了新的INT 13服务扩展标准。新的INT 13服务扩展标准不再使用操作系统的寄存器传递硬盘的寻址参数,而使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。通过这种方式,能实现在ATA总线基础上CHS寻址的最大容量是136.9 GB,而LBA寻址的最大容量是137.4GB。新的硬盘传输规范ATA 133规范又把28位可用的寄存器空间提高到48位,从而支持更大的硬盘。, Z4 l5 ~! j. ~/ w0 v+ E2 A2 t6 Q( A
分区表每一分区的第8至第11字节表示该分区的起始相对扇区数(即该扇区之前的绝对扇区个数),高位在右,低位在左;第12至第15字节表示该分区实际占用的扇区数,也是高位在右,低位在左;分区表这类数据结构的表达方式与机器中数据的实际存储方式在顺序上是一致的,即低位在前,高位在后。因此,在从16进制向十进制作数值转换时,需将字段中的16进制数以字节为单位翻转调位,用4个字节可以表示最大2^32个扇区,即2TB=2048GB。 L& c$ ^' @" ]
系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。在未超过8.4GB的分区上,C/H/S的表示方法和扇区数的表示方法所表示的分区大小是一致的。超过8.4GB的/H/S/C一般填充为FEH/FFH/FFH,即C/H/S所能表示的最大值;有时候也会用柱面对1024的模来填充。不过这几个字节是什么其实都无关紧要了。
! P! q- u6 u' j; T" E( z- ~ 扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录(Extended Boot Record,EBR)(图四)。5 p) s* S2 I0 Y* P9 ^, d% H
9 y2 C. |0 }3 c5 @9 w7 e
. j0 L( h0 {. J3 U$ \/ T7 w. n 扩展引导记录包括一个扩展分区表和扇区结束标志55AA。一个逻辑驱动器中的引导扇区一般位于相对扇区32或63。如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区;第二项指向下一个逻辑驱动器的EBR,如果不存在进一步的逻辑驱动器,第二项就不会使用,而被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区,第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。
1 t/ P4 ]# I8 A8 L 扩展分区表项中的相对扇区数是从扩展分区开始的扇区到该逻辑驱动器中第一个扇区的扇区数;占用的扇区数是指组成该逻辑驱动器的扇区数目。 t/ Z: X. B4 N1 \5 A2 f
有时候在磁盘的末尾会有剩余空间,由于分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。# S2 v7 W x& h4 r
三、主引导扇区的最后两个字节(偏移1FEH和偏移1FFH),其值为AA55H,它表示该扇区是个有效的引导扇区,可用来引导硬磁盘系统。
- f$ z2 a; g5 I( X/ h分区引导扇区DBR(DOS BOOT RECORD)是由FORMAT高级格式化命令写到该扇区的内容;DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区的DBR才会被MBR装入内存运行。
6 A6 ~, q1 e! K4 BDBR主要由下列几个部分组成:
5 G Z9 g4 |+ I+ F$ a; ~, F+ l 1.跳转指令,占用3个字节的跳转指令将跳转至引导代码。
5 ?" Y \$ @/ C' o- K2 r) L- h 2.厂商标识和DOS版本号,该部分总共占用8个字节。2 H. d+ _% m; I5 C; u' r
3.BPB(BIOS Parameter Block, BIOS 参数块)。: V0 }. ^7 o- N% Q( K$ B
4.操作系统引导程序。
S+ |. ~5 F7 b) i0 V 5.结束标志字,结束标志占用2个字节,其值为AA55
5 w' q( {7 A' U+ r$ }% d1 T DBR中的内容除了第5部分结束标志字固定不变之外,其余4个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。+ u3 e0 }0 y9 V& H
一、FAT32的分区引导扇区
: i- m( K+ O* Z 为了使加载文件的操作更加灵活,加上FAT32文件系统采用"活动"的FDT表,,同时考虑到引导程序的代码量和为今后发展保留适当的余量,FAT32文件系统分区引导扇区占据了6个扇区,只有前3个扇区作为系统的分区引导扇区,其余3个扇区保留暂未使用。分区引导扇区对于操作系统的启动和磁盘文件的访问具有至关重要的作用;引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。' r1 @7 w6 a: _3 {( r- z" |
由于分区引导扇区的重要性,FAT32文件系统在在第一个分区引导扇区的6个扇区后的6个扇区里保留了分区引导扇区的备份,在启动时操作系统可以对两份引导扇区进行比较,以便选择正确的引导扇区来引导系统。由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏的可能性非常小。
* J. [0 S8 m0 V" o& H t% ^分区引导扇区的第一个扇区(图六)的前三个字节是一条跳转指令,然后是8个字节长的OEM ID(厂家标识)和版本号,其后是简称为BPB的BIOS参数块(BIOS Parameter Block)。对于FAT32其各部分的意义如下表:
7 }" |6 G/ J" i) Y- ]偏移地址 | 长度(字节) | 意 义 | 0BH | 2 | 每个扇区的字节数,常取512。 | 0DH | 1 | 每簇扇区数;可以是1, 2, 4, 8, 16, 32, 64, 128,取决于文件系统格式及分区大小。 | 0EH | 2 | 为操作系统保留的扇区数;FAT32时多为十进制的32,FAT16时为1,有的格式化工具可能将它设为36或63。 | 10H | 1 | FAT表的个数;常取2。 | 11H | 2 | 在FAT16中存放系统根目录中允许登记的目录项个数,FAT32中用于标注系统采用的是否为FAT32文件系统。其值为0000H表示磁盘使用FAT32文件系统。 | 13H | 2 | 值为00H,为保持兼容性而保留,未使用。 | 15H | 1 | 磁盘介质标志,硬盘为F8。 | 16H | 2 | 未使用,值为00H。 | 18H | 2 | 每个磁道的扇区数。 | 1AH | 2 | 磁盘的磁头数。 | 1CH | 4 | 分区前隐藏扇区的个数。 | 20H | 4 | 逻辑磁盘中的扇区总数。 | 24H | 4 | 每个FAT表所占的扇区数。 | 28H | 2 | FAT表镜像标志,值为0表示系统保存2份互为备份的FAT表,值为1表示系统仅保存1份FAT表。 | 2AH | 2 | 文件系统的主次版本(保留)。 | 2CH | 4 | 磁盘根目录的起始簇号。 | 30H | 2 | 文件系统参数的扇区号,通常位于引导扇区的下一个扇区。 | 32H | 2 | 备份分区引导扇区的逻辑扇区号。 | 34H | 12 | 保留,未使用。 | 40H | 1 | 中断13呼叫的预设值,指明访问的设备;软盘为00H,硬盘为80H。 | 41H | 1 | 用于中断13呼叫。 | 42H | 1 | 磁盘读写参数扩展标志,其值为29H。 | 43H | 4 | 格式化时随机产生的磁盘卷的序列号。 | 47H | 11 | 格式化时人工输入的磁盘卷标号。 | 52H | 8 | 文件系统的标识号(FAT32)。 |
2 ~) J+ E2 n8 q5 z 从偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00开始的跳转指令所指向的,此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。
6 a$ y! i5 z7 | 扇区的最后两个字节存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。! U4 z E9 Q3 U) p$ ^2 p# E
* r+ j1 r* N, A4 |2 @" C2 k+ @
% a1 e' u# j! l" o7 [* X- c; u! C分区引导扇区的第2个扇区作为文件系统相关参数存储标识扇区(图七),除了保存扇区的标识信息(RraA(00H)和rrAa(1E4H))外,还可能在偏移地址1E8H处存储了文件系统有关的信息。其中扇区偏移地址1E8H~1EBH的4个字节存储了逻辑磁盘中未使用的簇数,通常用于快速计算逻辑磁盘的剩余空间(典型的操作是在资源管理器状态栏上列出的"可用磁盘空间"参数),而1ECH~1EFH 4个字节给出了逻辑盘中下一个可以分配给文件使用的空闲簇的簇号,这样操作系统可以不访问FAT表就直接获得磁盘剩余空间和可以分配的簇号。[: a& K$ V) u4 s% f! ]. A1 x+ N3 y
* a: Z) L. F+ E: n1 i1 a: j+ ^/ ?7 {/ _
" a2 X* d. M( p" C 分区引导扇区的第3个扇区则存储了引导扇区的后一部分引导系统的程序代码(图八)。
/ p0 K0 s- i2 I' g7 W, \ k- a% A$ ^" M- H* b
+ Y" K9 i, f5 s$ |- @) M, r
; b( \) M' d3 |2 e+ B二、NTFS的分区引导扇区
/ n4 q# l9 j7 L; c% [; z( m4 }- {% b `
对于NTFS分区来说,分区引导扇区DBR只占用一个扇区(图五),并且在该分区的最后一个扇区做了备份;NTFS的引导扇区也是完成引导和定义分区参数,NTFS分区的引导扇区不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。其BPB参数如下表所示: 偏移地址 | 长度(字节) | 常用值 | 意 义 | 0x0B | 2 | 0x0002 | 每扇区字节数 | 0x0D | 1 | 0x08 | 每簇扇区数 | 0x0E | 2 | 0x0000 | 保留扇区 | 0x10 | 3 | 0x000000 | 总为0 | 0x13 | 2 | 0x0000 | NTFS未使用,为0 | 0x15 | 1 | 0xF8 | 介质描述 | 0x16 | 2 | 0x0000 | 总为0 | 0x18 | 2 | 0x3F00 | 每磁道扇区数 | 0x1A | 2 | 0xFF00 | 磁头数 | 0x1C | 4 | 0x3F000000 | 隐藏扇区数 | 0x20 | 4 | 0x00000000 | NTFS未使用,为0 | 0x28 | 8 | 0x4AF57F0000000000 | 扇区总数 | 0x30 | 8 | 0x0400000000000000 | $MFT的逻辑簇号 | 0x38 | 8 | 0x54FF070000000000 | $MFT Mirr的逻辑簇号 | 0x40 | 4 | 0xF6000000 | 每MFT记录簇数 | 0x44 | 4 | 0x01000000 | 每索引簇数 | 0x48 | 8 | 0x14A51B74C91B741C | 卷标 | 0x50 | 4 | 0x00000000 | 检验和6 Q: Y8 S8 h' ~7 w& W: ] Q
|
|
|