MBR位于硬盘的0柱面,0磁头,1扇区,被称为主引导程序。
MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出。
MBR是位于磁盘最前边的一段引导代码。它负责磁盘操作系统对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统在对硬盘进行初始化时产生的。
MBR包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。

MBR由三个部分组成,主引导记录BootLoader、硬盘分区表DPT和硬盘有效标志。
在总共512字节的主引导扇区里
第一部分是BootLoader,占446个字节,它负责从活动分区中装载并运行系统引导程序;
第二部分是Partition table区(DPT分区表),占64个字节;

第三部分是Magic number,占2个字节。

所谓 BootLoader(启动加载器),偏移地址00000--0x1BD,是一小段代码(如GRUB的stage1),用于加载磁盘启动分区上更大的加载器(如vmlinuz)。

如果你安装了Windows,Windows启动加载器的初始信息就放在这个区域里;

如果MBR的信息被覆盖导致Windows不能启动,你就需要使用Windows的MBR修复功能来使其恢复正常。

如果你安装了Linux,则位于MBR里的通常会是GRUB加载器。

DPT分区表偏移地址为0x1BE--0x1fd,每个分区表项长16个字节,共64字节分别对应MBR的四个主分区。

每个分区表的16个字节含义如下
00-Partition Flag-00/不可引导、80/可以引导
01~03-Start CHS-分区开始的CHS值(磁头Head,扇区Sector,柱面Cylinder)
04-Partition Bytes-分区类型-83/linux、82/SWAP、8e/LVM
05~07-End CHS-分区结束的CHS值(磁头Head,扇区Sector,柱面Cylinder)
08~11-Start LBA-相对的起始扇区号(第二个分区=第一个分区起始扇区号+第一个分区的扇区数量)

12~15-Size-该分区所拥有的扇区数量

Magic Number也就是结束标志字,偏移地址0x1FE--0x1FF的2个字节,固定为55AA,如果该标志错误系统就不能启动。

我们可以用dd命令来将/dev/sda磁盘的MBR读出并写入到/tmp/mbr文件,如下:

[root@128 ~]# dd if=/dev/sda of=/tmp/mbr-128 bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000174479 秒,2.9 MB/秒
[root@130 ~]# dd if=/dev/sda of=/tmp/mbr-130 bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000160761 s, 3.2 MB/s

用hexdump打开/tmp/mbr文件,
注:-C的作用是用十六进制及ASCII的方式查看文件,并采用低/高位的方式显示

hexdump -C /tmp/mbr-128

hexdump -C /tmp/mbr-130

MBR内容的打开后共有32行,每行16个字节,共计512个字节

为了便于查看,我将内容复制到Excel中,将BootLoader的部分内容予以隐藏,结果如下图所示

其中128主机共分了三个区,130主机分了两个区,分区信息如下

[root@130 ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number  Start   End     Size    Type     File system  Flags1      1049kB  525MB   524MB   primary  ext4         boot2      525MB   21.5GB  20.9GB  primary               lvm
(parted)
[root@128 ~]# fdisk -l /dev/sda
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00000116设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     4810751     2097152   82  Linux swap / Solaris
/dev/sda3         4810752    41943039    18566144   83  Linux
[root@128 ~]#

下面我们来对两台主机的分区表进行详解

先将16位分区表进行区域拆分,如下图

192.168.254.128三个分区信息
80 20 21 0083 5e 38 2600 08 00 00 00 60 09 00   614400*512/1000/1000=315M
第一个分区是启动分区,拥有的扇区数量是614400,大小是315M,LBA寻址的起始扇区是2048

方法详解:

1、第一位是80,即可以启动

2、12~15位的Size的十六进制数值为00 60 09 00,高低位转换后为00096000,换算成十进制为614400,每个扇区大小512字节,换算成MB大小为315M

3、08~11位Start LBA起始扇区号十六进制数值为00 08 00 00,高低位转换后为00000800,换算成十进制为2048

00 5e 39 26 82 74 49 2b 00 68 09 00 00 00 40 00   4194304*512/1000/1000=2147M
第二个分区不可启动,拥有的扇区数量是4194304,大小是2147M,LBA寻址的起始扇区是2048+614400=616448
00 74 4a 2b 83 fe ff ff 00 68 49 00 00 98 36 02   37132288*512/1000/1000/1000=19G
第三个分区不可启动,拥有的扇区数量是37132288,大小是19G,LBA寻址的起始扇区是616448+4194304=4810752

192.168.254.130两个分区信息
80 20 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00   1024000*512/1000/1000=524M
第一个分区是启动分区,拥有的扇区数量是1024000,大小是524M,LBA寻址的起始扇区是2048
00 dd 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 70 02   40916992*512/1000/1000/1000=21G
第二个分区不可启动,拥有的扇区数量是40916992,大小是21G,LBA寻址的起始扇区是2048+1024000=1026048

最后,我们来看在两种不同的硬盘寻址方式:LBA和CHS

CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector),即所谓的CSH 3D参数 (Disk Geometry)。
磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁 头就可以表示数据在哪个磁面。
柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。
扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。

磁头/柱面/扇区理解示意图如下


所以在CHS寻址模式下,BIOS寻找的是硬盘空间的物理位置,所以CHS可以理解为物理寻址。
CHS寻址的最大容量为8GB
CHS寻址方式的容量由CHS三个参数决定:
磁头数最大为255 (用 8 个二进制位存储)。从0开始编号。
柱面数最大为1023(用 10 个二进制位存储)。从0开始编号。
扇区数最大数 63(用 6个二进制位存储)。从1始编号。
所以CHS寻址方式的最大寻址范围为:
255 * 1023 * 63 * 512 / 1048576 = 7.837 GB ( 1M =1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8.414 GB ( 1M =1000000 Bytes )

LBA(Logical Block Addressing)逻辑块寻址模式,也叫线性寻址,在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。
LBA编址方式将 CHS这种三维寻址方式转变为唯一的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为线性编号,系统效率得到大大提高,避免了 烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器将这种逻辑地址转换为实际硬盘的物理地址。
LBA寻址的最大容量为2.2TB
由于MBR中DPT分区表中LBA寻址的部分只有32位(4个分区*每个分区表8位LBA寻址),因此最大仅能够支持2^32(2的32次方)个扇区,而每个扇区的数据量是512字节,于是2^32 x 512,就得出了最大支持容量,这个数值按硬盘厂商的计算方式(1000进位制)来说,大约就是2.199TB.
目前大部分主板BIOS采用的都是LBA寻址,CHS寻址很早之前就已经无人使用了,另外,在MBR分区表中CHS和LBA的地址是可以互换的,互换公式请自行百度,以本人的数学能力暂时无法理解

本文广泛参考了百度百科及以下链接内容

http://fyzx.ankang.gov.cn/Article/Class26/201408/1484.html

http://wushank.blog.51cto.com/3489095/1144637

http://diy.pconline.com.cn/329/3292501_all.html

http://blog.sina.com.cn/s/blog_4b9eab3201011p8c.html

http://www.cnblogs.com/joyzhuang/p/4126325.html

linux系统启动2——MBR相关推荐

  1. linux启动写入了mbr,一、Linux系统启动(MBR)

    1.系统启动流程 BIOS(Basic Input Output System):基本输入输出系统完成 ①硬件检查②可启动设备查找 可启动设备(Master Boot Record):主引导记录 字节 ...

  2. Linux系统启动级别及grub配置(一)

    一.Linux系统启动流程 1.首先电脑加电自检,进入到BIOS中,通过MBR装载bootloader,再由bootloader装载内核在内存中完成解压,再将控制权交由内核,内核完成硬件的探测再访问i ...

  3. Linux 系统启动流程及其介绍

    熟悉Linux系统启动流程可以更好的排除Linux系统在启动的过程中所遇到的错误,下面介绍Linux系统在启动过程. 开机,BIOS自检:检测外置设备,目的是为了把外围设备的信息提供给操作系统使用 寻 ...

  4. linux系统运行pbs出现ntf,Linux系统启动故障修复

    Linux在启动过程中会出现一些故障,导致系统无法正常启动,本文列举了几个应用单用户模式.GRUB命令操作.Linux救援模式的典型故障修复案例. 一.单用户模式 Linux提供了单用户模式(类似Wi ...

  5. linux系统启动故障排除

    linux也会有系统故障,当你好心情启动系统学习时却发生了故障起不来,岂不是很难受:接下来就简单说明系统启不了的问题排查. linux系统是怎样启动的.会经过哪些初始化进程,大致是两个阶段都都是什么? ...

  6. 5. linux操作系统bios启动过程需要执行哪几个操作?,Linux系统启动的大致过程

    Linux系统启动的大致过程 Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,它诞生于1991 年的 [Linux桌面] 10 月5 日.下面小编准备了关于Linux系统启动的大致过程 ...

  7. linux 系统重启过程,linux 系统启动流程

    linux系统启动流程可以简单总结为以下几步 1)开机BIOS自检 2)读取MBR,进行MBR引导 3)启动bootloader 4)加载内核kernel 5)启动init进程,依据inittab文件 ...

  8. Linux系统启动过程详解

    目录 linux系统启动详细过程 内核引导 启动init程序进入初始化阶段 init程序的类型 系统初始化 建立终端 用户登录 关机 linux系统启动详细过程 通电 bios初始化 grub2磁盘引 ...

  9. linux efi 启动原理,Linux系统启动过程

    了解Linux系统的启动过程有助于我们深入理解Linux系统运行原理,下面我们将介绍一些系统启动过程中一些重要的细节.在这里,我们将Linux系统启动过程分成7个步骤介绍,这个过程如下图所示. 1.启 ...

最新文章

  1. 一起ORACLE数据库中数据查询结果不一致问题的排查过程
  2. 自动添加端口添加至Windows防火墙脚本
  3. Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825...
  4. Java的知识点25——程序、进程与线程 || 线程的创建和启动
  5. 在eclipse使用git管理项目工程代码
  6. php 数组值sum,php sum数组值(如果特定列的值重复)
  7. 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩
  8. ROS,launch学习
  9. FLC-Regular Grammar
  10. ubuntu18.04安装有道词典等常用软件
  11. Python实现分解质因数
  12. 安卓模拟经营类游戏_十大最诱人手机模拟经营类游戏专题
  13. word文档 文字变网址 解决办法
  14. 河北省谷歌高清卫星地图下载
  15. 为了拿到像素点,GetPixel的速度太慢,改用CreateDIBSection
  16. Kinect for Windows SDK v2.0 开发笔记 (十二) 高清面部帧(3) 面部模型(2D)
  17. Android仿微信朋友圈2自定义点赞评论弹框
  18. 学习Android系统
  19. 用画中画剪辑技巧,给每个视频添加背景图片
  20. indexedDB基本使用(内含案例)

热门文章

  1. 思科路由器关联RADIUS服务器配置命令
  2. 利用输入法的用户自定义短语,快速插入代码框架,解放双手
  3. 基于DHCP和NAT的家庭网络设备间通信解决方案
  4. 3D大底批量分布处理7.47h注册版
  5. 使命召唤12服务器系统,《使命召唤12:黑色行动3》PS4版全面开测,服务器质量遭吐槽...
  6. Spring Scheduling 调度/定时任务
  7. 初探JAVA代码在虚拟机中的运行机制
  8. System32与SysWow64
  9. C语言进阶--自定义类型:结构体,枚举,联合
  10. Android游戏历程,快忘掉“吃鸡” 2019最佳Android游戏Top20出炉