MBR介绍 简介 MBR,全称为 MasterBoot Record,即 硬盘的 主引导记录。 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。 硬盘的0柱面、0磁头、1扇区称为主 引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的 主引导扇区里 主引导程序(boot loader)占446个字节,第二部分是Partitiontable区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic number,占2个字节,固定为55AA。 注意 MBR是不属于任何一个 操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以通过命令来修改和重写,如在minix3里面,可以用命令:installboot-m /dev/c0d0 /usr/mdec/masterboot来把masterboot这个小程序写到mbr里面,masterboot通常用汇编语言来编写。我们也可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE来读取。 调用参数 用INT13H的读磁盘扇区功能的调用参数如下: 入口参数:AH=2 (指定功能号) AL=要读取的扇区数 DL=磁盘号(0、1-软盘;80、81-硬盘) DH=磁头号 CL高2位+CH=柱面号 CL低6位=扇区号 CS:BX=存放读取数据的内存缓冲地址 出口参数:CS:BX=读取数据存放地址 错误信息:如果出错CF=1 AH=错误代码 用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下: A>DEBUG -A 100 XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区) XXXX:XXXX MOV BX,1000 (把读出的数据放入 缓冲区的地址为CS:1000) XXXX:XXXX MOV CX,0001 (读0柱面,1扇区) XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头) XXXX:XXXX INT 13 XXXX:XXXX INT 3 XXXX:XXXX (按回车键) -G=100 (执行以上程序段) -D 1000 11FF (显示512字节的MBR内容) 在windows操作系统下,例如xp,2003,Vista,windows7,有 微软提供的接口直接读写mbr; FILE *fd=fopen("\\\\.\\PHYSICALDRIVE0","rb+"); char buffer[512]; fread(buffer,512,1,fd); //then you can edit buffer[512] as yourwish...... fseek(fd,0,SEEK_SET); //很重要 fwrite(buffer,512,1,fd); //把修改后的MBR写入到你的机器 fclose(fd); //大功告成 MBR组成 一个扇区的硬盘主引导记录MBR由4个部分组成。 硬盘MBR扇区 ·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。 ·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。 ·分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。 ·结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。 MBR的结构如下表所示 具体含义如下: (1)0x00~0x1BD:446个字节,包含一段指令,用以通知计算机如何访问分区表并定位操作系统的位置 这部分的代码会因为操作系统不同而不同,利用引导代码可以实现多重系统引导。多系统引导有两种方法可以实现:一种方法是用Windows操作系统在引导分区中设置一段代码,先加载进入用户选择系统的界面,允许用户选择要进入的系统,再进入指定的系统;第二种方法是改变MBR中的引导代码,该代码直接呈现给用户一个选择系统的界面。 (2)0x1BE~0x1FD:64个字节,4个分区表项,每个表项占用16个字节,描述一个分区,最多可以描述4个分区(这就是为什么MBR分区体系只能分成4个区【我们平时看到的分区一般可以从26个字母中选取任意多个当做分区标识(多于4个),这是因为那些分区是逻辑分区,这里的4个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三级扩展分区。】)。 分区表项并没有顺序要求,即不要求第一个分区表项在第二个分区表项前。 分区表也不要求从第一个分区表项开始 (3)0x1FE~0x1FF:2个字节,有效结束标志“55AA”。如果没有这个标志,操作系统会认为磁盘没有初始化,无法正确加载磁盘的分区。 分区表参数含义(字节) 1 活动(80)或非活动分区(00) 2 3 4 起始的磁头 01 柱面 01 扇区00值 5 分区类型符 NTFS(07 06)FAT32(0B 0C)扩展(0F 05) 6 7 8 结束的磁头 FE 柱面 FF 扇区FF值 9 10 11 12 本分区之前已用扇区数 13 14 15 16 本分区大小
这里有一篇文章也值得体会一下
http://blog.csdn.net/yunfly163/article/details/7411516
一、 我的 bochs 上的 windows 7 的 disk images 介绍 在 bochs 上,我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间,bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63 cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱面 - 每道扇区数)为 63 那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g
二、硬盘的 MBR(主引导记录) MBR 是位于:0 扇区(逻辑扇区) 即:0 柱面(0-cylinder),0 磁头(0-head),1 扇区(1-sector) 大小为 512 bytes。 整个 MBR 的结构如下:
1、磁盘分区表(Disk Partition Table) 在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。 表1:磁盘分区表1(DPT1)结构 2、下面看看我的 bochs 上安装的 windows 7 分区表 (1)分区1结构 [cpp] view plaincopyprint?
-
-
- 000001BE 80
-
-
-
- 000001BF 20
- 000001C0 21
- 000001C1 00
-
- 000001C2 07
- 00h:未知操作系统
- 01h:DOS FAT12(16位扇区数)
- 02h:XENIX
- 04h:DOS FAT16(16位扇区数)
- 05h:DOS 扩展分区(DOS 3.3+)
- 06h:DOS 4.0 (Compaq 3.31), 32位扇区数
- 07h:HPFS/NTFS
- 0ah:OS/2
- 0bh:win95 fat32
- 0ch:win95 fat32 (LBA)
- ... ...
-
- 000001C3 DF
- 000001C4 13
- 000001C5 0C
-
-
- 000001C6 00080000
-
- 000001CA 00200300
-
可以看出分区1是: ★ boot indicator = 80 表示:该分区是可启动的分区。 ★ 起始扇区是:0 - cylinder, 0x20 - heads, 0x21 - sector 1 byte 的 head 最大可表示:0xFF 个 heads,即:255 个 heads 6 bits 的 sector 最大表示: 0x3F 个 sector 即:63 个 sectors 10 bits 的 cylinder 最大表示:0x3FF 个 cylinder 即: 1023 个 cylinders 每个 cylinder 的扇区为:heads * 63 = 255 * 63 = 16065 sectors
那么:分区1的起始扇区是第几扇分区呢? 它的逻辑分区 L 是: L = cylinder * 16065 + heads * 63 + sector - 1 = 0 * 16065 + 0x20 * 63 + 21 - 1 = 0x20 * 63 + 0x20 = 2048 因此,分区1的起始扇区是第 2048 号扇区,即说明,此分区前面有 2048 个扇区被保留(扇区号从 0 开始编号) ★ 分区1 的文件系统是 ntfs 文件系统。 ★ 分区1 的结束扇区是: 0xdf - heads, 0x13 - sectors, 0x0c - cylinder 那么,结束扇区是第几号扇区呢?
L = cylinder * 16065 + heads * 63 + sectors - 1 = 0x0c * 16065 + 0xdf * 63 + 0x13 - 1 = 192780 + 14049 + 18 = 206848 结束扇区是第 206848 号扇区。 因此:分区的扇区数是:206848 - 2048 = 204800 个扇区
★ 分区1 前的扇区数是: 00080000 由于是 little-endian 排列,它的 size 是 0x00000800 即:2048 个扇区 正好符合前面说的 2048 个扇区。 ★ 分区1 的扇区数是: 00200300 同样是 little-endian 排列,它的 size 是 0x00032000 即: 204800 个扇区 正好符合前面说的 204800 个扇区数。 size: sectors * 512 byte = 204800 * 512 = 100MB 由此可见,分区1 共有 100M 的磁盘空间。
2、分区 2 的结构 [cpp] view plaincopyprint?
- 000001CE 00
-
- 000001CF DF
- 000001D0 14
- 000001D1 0C
-
-
- 000001D2 07
-
- 000001D3 FE
- 000001D4 FF
- 000001D5 FF
-
-
- 000001D6 00280300
-
- 000001DA 00C83C01
可以看出分区2 是: ★ 该分区是不可启动的分区。 ★ 起始扇区是:L = 0x0c * 16065 + 0xdf * 63 + 0x14 - 1 = 206849 号扇区,
正好是分区1的结束扇区的地址,表示下一扇区的开始。
★ 文件系统同样是 ntfs ★ 结束扇区是:L = 0x3ff * 16065 + 0xfe * 63 + 0x3f - 1 = 16450559 号扇区。 ★ 分区前扇区数:00280300 = 0x00032800 = 206848 扇区。 ★ 分区的扇区数:00c83c01 = 0x013cc800 = 20760576 扇区数
那么,分区2的大小是 ≈ 10g 约等于 10g, 由于分区 1 的大小是 100M bytes,分区2大小约为 10g
这里有一个现象: 前面说的结束分区是 16450559 号扇区,明显是不对的。这是因为,cylinder 最大只能表示 1023 个(1023*255*63 =16434495) 超过部分没办法表示,这里就以分区扇数为准。 :(
由此可见:
在 windows 7 的默认分区下,分区1 只是启动分区,分区2 则整个系统的分区。
|
从 0x00 - 0x162 :这是 MBR 的主体代码区域 从 0x162 - 0x1bd:这是 MBR 用到的数据区域 从 0x1be - 0x1fd: 这是 MBR 的磁盘分区表区域 从 0x1fe - 0x1ff:这是 MBR 的标志 "55AA"
-----------------------------------------------------------------------------------------------------
chs mode是磁盘寻址模式, c=cyclinder柱面数 h=head磁头数 s=sector扇区数 这是一种传统的硬盘寻址模式,只支持小容量的盘 新的主要是LBA模式(逻辑寻址模式)支持大容量硬盘
#define CHS_MODE 0
#define LBA_MODE !(CHS_MODE) -----------------------------------------------------------
|