4068|2

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

认识MBR [复制链接]

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的结构如下表所示
  
  
字节偏移(16进制)
  
字节数
描述
00~1BD
446
引导代码
1BE~1CD
16
分区表项1
1CE~1DD
16
分区表项2
1DE~1ED
16
分区表项3
1EE~1FD
16
分区表项4
1FE~1FF
2
签名值“55AA”
具体含义如下:
  (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)

-----------------------------------------------------------

最新回复

不错不错啊  详情 回复 发表于 2013-12-18 18:21
点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报

2781

帖子

417

TA的资源

五彩晶圆(中级)

沙发
 
不错不错啊

点评

我也是对mbr 最近有比较深刻的认识。  详情 回复 发表于 2013-12-19 10:15
 
个人签名
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
原帖由 qinkaiabc 于 2013-12-18 18:21 发表
不错不错啊
我也是对mbr 最近有比较深刻的认识。
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表