主引导记录(MBR)



主引导记录(MBR) 
和 
为什么它是必要的?


如果您是通过搜索引擎来到这里的,并且没有菜单, 请点击此处 !
当您打开PC时,处理器会尝试开始处理数据的过程。 但是,由于系统内存是空的,处理器并没有真正的执行任何东西,甚至开始知道在哪里寻找它。 为确保无论BIOS代码如何,PC始终能启动,芯片和BIOS制造商都开发了他们的代码,以便处理器一旦开机,就会始终在相同的地方FFFF0h开始执行。


同样,每个硬盘必须具有一致的“起点”,其中存储有关磁盘的关键信息,例如分区数量和类型。 还必须有一些地方BIOS可以加载启动加载操作系统的初始启动程序。 存储这些信息的地方称为主引导记录 ( MBR ),也称为主引导扇区 ,甚至称为引导扇区 。 请勿将主引导扇区与卷引导扇区混淆,后者确实不同。


主引导记录始终位于磁盘0,磁头0和扇区1(磁盘上的第一个扇区)。 这是磁盘始终使用的一致起点。 当计算机启动并且BIOS引导机器时,它总是会首先查看该第一扇区以获取有关如何继续引导过程和加载操作系统的说明和信息。 主引导记录包含以下结构:


主分区表:被称为表的这一小部分代码包含硬盘上包含的分区的完整描述。 当开发人员设计了这个主分区表的大小时,他们留下了足够空间来描述四个分区,因此四个分区(四个物理分区)的限制。 出于这个原因,除此之外,硬盘可能只有四个真正的分区,也称为主分区或物理分区 。 任何其他分区必须是链接到(或属于)其中一个主分区的逻辑分区。 其中一个分区被标记为活动的,表明它是计算机应该用来继续引导过程的分区。 


主引导代码:主引导记录是BIOS加载并执行以启动引导过程的一小部分计算机代码。 此代码在完全执行时将控制转移到存储在引导(活动)分区上的引导程序以加载操作系统。
显然,由于主引导记录中存储的信息非常重要,如果它以某种方式被损坏或损坏,通常会发生严重的数据丢失。 主引导代码是打开PC时执行的第一个程序,通常是病毒的目标。 为了理解主引导记录和其中的主引导代码,理解计算机启动时发生的事件序列可能会有所帮助。


虽然经常被忽略作为诊断工具,但计算机执行的启动顺序通常会告诉您,如果您遇到问题(即使是中等程度问题),硬件本身可能会出现问题。 以下内容将逐步介绍系统引导顺序。 如果您注意到每个事件序列中有任何不寻常的事情,那么您只需要看看延迟出现的步骤或返回一步。


系统启动序列期间发生了什么?


系统BIOS是在计算机主板上的BIOS prom芯片中插入的一小段代码,它是启动计算机时运行的。 下面我们概述了计算机启动过程中发生的典型事件顺序,虽然它们会因您的硬件制造商,BIOS以及PC中的外围设备而异。 再次,这是您打开计算机电源开关时发生的一系列典型事件:


内部电源开启,初始化,然后花一些时间为计算机的其他部分生成可靠的电源。 如果主板芯片组以及随后的处理器接收的功率不在预期的参数范围内,芯片组将以与触摸重置按钮相同的方式向处理器生成重置信号。 这将持续到主板从电源接收到电源正常信号或由于电源故障而关闭系统。 


在收到电源正常信号后,或在复位按钮释放并确认可靠电源后,处理器将准备好开始执行。 当处理器第一次启动时,它确实不知道下一步该怎么做,因为内存中没有什么可执行。 当然,处理器设计人员都知道这一点,所以他们预先编程处理器,以便始终查看系统中相同的位置(BIOS ROM),以便启动代码的一小部分来启动引导过程。 这通常位于内存位置FFFF0h处,或位于系统内存的末端。 如果必须更改ROM的大小以防止兼容性问题,开发人员会在那里找到它。 由于从那里到传统内存区域只有16个字节,这个位置只包含一个“跳转”指令,告诉处理器去哪里寻找真正的BIOS启动程序。 


BIOS执行开机自检(POST) 。 如果有任何致命错误,则启动过程停止。 如果POST成功,BIOS将调用INT 19(中断19),然后继续查找连接到主板的设备。 


BIOS代码通过查找视频卡开始搜索,更具体地说,它寻找显卡内置的BIOS程序(通常在内存中的位置C000h处找到),如果找到,则运行该程序。 系统BIOS执行视频卡BIOS,然后对视频卡进行初始化。 大多数现代视频卡都会在屏幕上显示关于显卡的信息,这就是为什么在某些现代PC上,通常会在屏幕上看到有关显卡的信息,然后才能看到系统BIOS本身的消息。 


一旦启用了视频,BIOS就开始搜索可能拥有自己的ROM的其他设备以及该ROM是否拥有自己的BIOS代码。 通常情况下,软盘驱动器位于0000:7C00,IDE / ATA硬盘BIOS将在C8000h处找到。 如果找到软盘和/或硬盘驱动器,则会执行它们的代码。 如果在此INT 19进程中找到任何其他设备BIOS,则也会执行它们。 


BIOS显示其启动屏幕 ,其中提供了有关BIOS的一些关键信息以及其他系统信息。 


随着启动顺序的继续,BIOS继续对系统执行其他测试。 根据系统制造商的不同,这通常会包含一个内存计数。 如果在计算安装的内存时遇到错误,BIOS通常会在屏幕上显示一条错误消息。 您可以在我们的主板和BIOS部分的支持中心找到这些错误消息及其解释,或者您可以点击此处 。 (点击这里将打开一个新窗口) 


在BIOS启动过程的下一阶段,它会对系统中安装的硬件进行一定程度的清点,然后进行通信或询问以确保硬件正常工作。 大多数现代BIOS都具有自动设置,可根据所发现的内存类型来收集内存时序等信息。 今天的BIOS会动态设置硬盘参数和访问模式,并会在屏幕上显示一条消息,以便以这种方式检测和配置每个驱动器。 它还将搜索和标记逻辑设备,如COM和LPT端口。 注意:如果BIOS支持即插即用标准,并且该功能已启用,则此时它将检测并配置即插即用设备,并在屏幕上显示每条找到的消息。 


在POST和BIOS启动过程的最后阶段,BIOS将显示包含系统配置的摘要屏幕。 尽管486到Pentium II早期的机器对于系统配置信息相当准确,但后来使用后来的Pentium III和AMD处理器的机器可能会有一些不准确的信息。 这通常与涉及处理器信息的BIOS设置问题有关。 检查这些数据可以帮助诊断设置问题,虽然它很难看,因为有时它会在屏幕上闪烁,然后从顶部滚动。 


一旦BIOS完成所需要的操作,它就开始搜索驱动器来引导操作系统。 所有的BIOS都包含一个控制引导驱动器搜索顺序的设置。 大多数设置为首先查找可引导软盘,如果找不到,则进入硬盘,通常是C:驱动器。 某些BIOS允许您从CD-ROM驱动器或其他设备(如SCSI(小型计算机系统接口))启动,具体取决于所选的启动顺序。 一旦BIOS识别出其目标引导驱动器,它就会查找引导信息以启动操作系统引导过程。 如果正在搜索硬盘,则会在磁盘0,磁头0,扇区1(磁盘上的第一个扇区)中查找主引导记录。 如果正在搜索软盘,它将在软盘上查看卷引导扇区的相同地址。 


一旦找到引导扇区并验证其内容或数据,BIOS将使用引导扇区中的信息启动引导操作系统的过程。 如果这是一个软盘引导扇区,则信息将被读入内存0000:7c00的内存中。 INT 19转到内存位置0000:7c00以继续进程。 如果在软盘驱动器上找不到引导扇区,则INT 19将移动到主板BIOS提供的列表中的下一个可引导驱动器(通常是硬盘驱动器),然后尝试读取MBR。 如果找到主引导记录,则它将在0000:7c00的位置被读入内存,INT 19将跳转到内存位置0000:7c00,与软盘的情况相同。 此时,BIOS会尝试将计算机的控制权从BIOS移至实际操作系统。 


接下来,主启动记录中的小程序将尝试在硬盘驱动器分区表中查找活动(可启动)分区。 如果找到了这样的分区,那么该分区的引导扇区也会在0000:7C00的位置被读入内存,然后MBR程序本身会跳转到内存位置0000:7C00。 请记住,每个操作系统都有自己的引导扇区格式。 下一步就是引导扇区中的小程序定位操作系统的内核加载器程序的第一部分,或者在某些情况下内核本身或可能是引导管理器程序,然后将其读入内存。 对于Windows NT和Windows 2000的粉丝来说,这个内核加载器被称为NTLDR。 你会在这里找到DOS启动过程的描述 。 


如果找不到任何类型的引导设备,系统将显示一条错误消息并停止。 具体的错误信息取决于BIOS开发人员和/或计算机的制造商,并且可以是从一个相当清楚的“无引导设备”到非常神秘的“NO ROM BASIC - SYSTEM HALTED”的任何内容。 如果您有可启动的硬盘分区,但是却忘记将其设置为活动状态,也会发生这种情况。 信不信由你,你可以对驱动器进行分区,格式化和安装操作系统,并且直到该操作系统第一次启动时才会意识到存在问题。
这整个过程被称为“冷启动”(因为机器已关闭,或者冷启动时)。 “热启动”也称为“软启动”,除了使用Ctrl + Alt + Del键重新启动计算机时发生的情况外,其他情况也是如此。 在这种情况下,POST会被跳过,启动过程大致在上面的步骤8继续。 作为附注,当使用CTRL-ALT-DEL键时,INT 19也被调用。 在大多数系统上,在调用INT 19之前,Ctrl + Alt + Del会导致软启动或缩短POST的版本。


许多事情都可能会损坏主引导记录,因此,您可能会知道代码的某些部分驻留在MBR中,是否需要手动恢复MBR。


你会发现:


MBR程序代码从偏移量0000开始。
MBR消息从偏移量008b开始。
分区表从01be开始。
签名位于偏移量01fe处。
概要 
如果找到一个活动分区,无论它在哪里找到,那么该分区的引导记录将在0000:7c00处读入内存,然后将MBR代码添加到指向描述正在引导的分区的分区表项的0000:7c00。 引导记录程序使用此数据来确定从哪个驱动器启动,以及磁盘上分区的确切位置。 如果没有找到活动的分区表条目,引导过程将通过INT 18进入ROM BASIC。所有其他错误都会导致系统挂起或停止。


笔记(非常重要)


活动分区表项的第一个字节是80。 


该字节在INT 13被调用以读取引导扇区之前被加载到DL寄存器中。 INT 13被调用时,DL是BIOS设备编号。 因此,此MBR程序读取的引导扇区只能从BIOS设备编号80(第一个硬盘)中读取。 这是通常无法从任何其他硬盘启动的原因之一。 当然,每条规则都有例外,但这些都超出了本练习的范围。 


MBR程序使用基于CHS的INT 13H AH = 02H调用来读取活动分区的引导扇区。 活动分区的引导扇区的位置在CHS格式的分区表项中。 如果驱动器是528MB,则此CHS必须是已翻译的CHS。 LBA表格中没有地址被使用(LBA没有解决528MB问题的另一个原因)。
整个MBR记录为十六进制和ASCII 
OFFSET 0 1 2 3 4 5 6 7 8 9 A B CDE F * 0123456789ABCDEF * 
000000 fa33c08e d0bc007c 8bf45007 501ffbfc * .3 ..... | ..PP .. * 
000010 bf0006b9 0001f2a5 ea1d0600 00bebe07 * ................ * 
000020 b304803c 80740e80 3c00751c 83c610fe * ..... t .... u ..... * 
000030 cb75efcd 188b148b 4c028bee 83c610fe * .u ...... L ....... * 
000040 cb741a80 3c0074f4 be8b06ac 3c00740b * .t .... t ....... t。* 
000050 56bb0700 b40ecd10 5eebf0eb febf0500 * V ....... ^ ....... * 
000060 bb007cb8 010257cd 135f730c 33c0cd13 * .. | ... W .._ s.3 ... * 
000070 4f75edbe a306ebd3 bec206bf fe7d813d * Ou ...........}。= * 
000080 55aa75c7 8bf5ea00 7c000049 6e76616c * Uu .... | ..Inval * 
000090 69642070 61727469 74696f6e 20746162 * id分区标签* 
0000a0 6c650045 72726f72 206c6f61 64696e67 * le.Error加载* 
0000b0 206f7065 72617469 6e672073 79737465 *操作系统* 
0000c0 6d004d69 7373696e 67206f70 65726174 * m.Missing operat * 
0000d0 696e6720 73797374 656d0000 00000000 *系统...... * 
0000e0 00000000 00000000 00000000 00000000 * ................ * 
0000f0 TO 0001af同上 
0001b0 00000000 00000000 00000000 00008001 * ................ * 
0001c0 0100060d fef83e00 00000678 0d000000 * ........... x .... * 
0001d0 00000000 00000000 00000000 00000000 * ................ * 
0001e0 00000000 00000000 00000000 00000000 * ................ * 
0001f0 00000000 00000000 00000000 000055aa * .............. U. * 




拆卸MBR 
这个扇区最初在0000:7c00被加载到内存中,但它会立即将其自身重新定位到0000:0600。


 
                   BEGIN:现在在0000:7C00,重新编号 


  0000:7C00 FA CLI禁用int的 
  0000:7C01 33C0 XOR AX,AX将堆栈段设置为0000 
  0000:7C03 8ED0 MOV SS,AX 
  0000:7C05 BC007C MOV SP,7C00将堆栈ptr设置为7c00 
  0000:7C08 8BF4 MOV SI,SP SI现在7c00 
  0000:7C0A 50 PUSH AX 
  0000:7C0B 07 POP ES ES现在0000:7c00 
  0000:7C0C 50 PUSH AX 
  0000:7C0D 1F POP DS DS现在0000:7c00 
  0000:7C0E FB STI允许int 
  0000:7C0F FC CLD清除方向 
  0000:7C10 BF0006 MOV DI,0600 DI现在0600 
  0000:7C13 B90001 MOV CX,0100移动256个字(512字节) 
  0000:7C16 F2 REPNZ从0000:7c00移动MBR 
  0000:7C17 A5 MOVSW到0000:0600 
  0000:7C18 EA1D060000 JMP 0000:061D跳至NEW_LOCATION 


          NEW_LOCATION:现在在0000:0600 


  0000:061D BEBE07 MOV SI,07BE指向第一个表格条目 
  0000:0620 B304 MOV BL,04有4个表格条目 


          SEARCH_LOOP1:搜索主动登录 


  0000:0622 803C80 CMP BYTE PTR [SI],80是否是主动条目? 
  0000:0625 740E JZ FOUND_ACTIVE yes 
  0000:0627 803C00 CMP BYTE PTR [SI],00是否为非活动条目? 
  0000:062A 751C JNZ NOT_ACTIVE no 
  0000:062C 83C610 ADD SI,+ 10 incr table ptr by 16 
  0000:062F FECB DEC BL decr计数 
  0000:0631 75EF JNZ SEARCH_LOOP1 jmp如果不是表的结尾 
  0000:0633 CD18 INT 18转到ROM基本 


          FOUND_ACTIVE:找到主动进入 


  0000:0635 8B14 MOV DX,[SI]为INT 13呼叫设置DH / DL 
  0000:0637 8B4C02 MOV CX,[SI + 02]为INT 13调用设置CH / CL 
  0000:063A 8BEE MOV BP,SI保存表ptr 


          SEARCH_LOOP2:确保只有一个主动输入 


  0000:063C 83C610 ADD SI,+ 10 incr table ptr by 16 
  0000:063F FECB DEC BL decr计数 
  0000:0641 741A JZ READ_BOOT jmp如果表结束 
  0000:0643 803C00 CMP BYTE PTR [SI],00是否为非活动条目? 
  0000:0646 74F4 JZ SEARCH_LOOP2是的 


            NOT_ACTIVE:发现多于一个主动输入 


  0000:0648 BE8B06 MOV SI,068B显示“Invld prttn tbl” 


           DISPLAY_MSG:显示消息循环 


  0000:064B AC LODSB获取消息的字符 
  0000:064C 3C00 CMP AL,00消息结束 
  0000:064E 740B JZ HANG是的 
  0000:0650 56 PUSH SI保存SI 
  0000:0651 BB0700 MOV BX,0007屏幕属性 
  0000:0654 B40E MOV AH,0E输出1个字符的消息 
  0000:0656 CD10 INT 10到显示器 
  0000:0658 5E POP SI恢复SI 
  0000:0659 EBF0 JMP DISPLAY_MSG再次执行此操作 


                  杭:悬挂系统循环 


  0000:065B EBFE JMP HANG坐下并留下! 


             READ_BOOT:读取激活的参数引导记录 


  0000:065D BF0500 MOV DI,0005 INT 13重试计数 


             INT13RTRY:INT 13 RETRY LOOP 


  0000:0660 BB007C MOV BX,7C00 
  0000:0663 B80102 MOV AX,0201读取1扇区 
  0000:0666 57 PUSH DI保存DI 
  0000:0667 CD13 INT 13将扇区读入0000:7c00 
  0000:0669 5F POP DI恢复DI 
  0000:066A 730C JNB INT13OK jmp如果没有INT 13 
  0000:066C 33C0 XOR AX,AX调用INT 13和 
  0000:066E CD13 INT 13进行磁盘复位 
  0000:0670 4F DEC DI decr DI 
  0000:0671 75ED JNZ INT13RTRY如果不是零,请再试一次 
  0000:0673 BEA306 MOV SI,06A3显示“Errr ldng systm” 
  0000:0676 EBD3 JMP DISPLAY_MSG jmp显示循环 


               INT13OK:INT 13错误 


  0000:0678 BEC206 MOV SI,06C2“缺少操作系统” 
  0000:067B BFFE7D MOV DI,7DFE指向签名 
  0000:067E 813D55AA CMP WORD PTR [DI],AA55是否正确? 
  0000:0682 75C7 JNZ DISPLAY_MSG no 
  0000:0684 8BF5 MOV SI,BP设置SI 
  0000:0686 EA007C0000 JMP 0000:7C00跳至引导扇区 
                                                        与SI指向 
                                                        部分表入口 


  信息在这里。 


  0000:0680 ........ ........ ...... 49 6e76616c * Inval * 
  0000:0690 69642070 61727469 74696f6e 20746162 * id分区选项卡* 
  0000:06a0 6c650045 72726f72 206c6f61 64696e67 * le.Error loading * 
  0000:06b0 206f7065 72617469 6e672073 79737465 *操作系统* 
  0000:06c0 6d004d69 7373696e 67206f70 65726174 * m.Missing operat * 
  0000:06d0 696e6720 73797374 656d00 .. ........ *系统。  * 


  数据未使用。 


  0000:06d0 ........ ........ ...... 00 00000000 * ..... * 
  0000:06e0 00000000 00000000 00000000 00000000 * ................ * 
  0000:06f0 00000000 00000000 00000000 00000000 * ................ * 
  0000:0700 00000000 00000000 00000000 00000000 * ................ * 
  0000:0710 00000000 00000000 00000000 00000000 * ................ * 
  0000:0720 00000000 00000000 00000000 00000000 * ................ * 
  0000:0730 00000000 00000000 00000000 00000000 * ................ * 
  0000:0740 00000000 00000000 00000000 00000000 * ................ * 
  0000:0750 00000000 00000000 00000000 00000000 * ................ * 
  0000:0760 00000000 00000000 00000000 00000000 * ................ * 
  0000:0770 00000000 00000000 00000000 00000000 * ................ * 
  0000:0780 00000000 00000000 00000000 00000000 * ................ * 
  0000:0790 00000000 00000000 00000000 00000000 * ................ * 
  0000:07a0 00000000 00000000 00000000 00000000 * ................ * 
  0000:07b0 00000000 00000000 00000000 0000 .... * ............ * 


  分区表从0000:07be开始。  每个分区表 
  条目是16个字节。  该表定义了一个主分区 
  这也是一个活动(可启动)分区。 


  0000:07b0 ........ ........ ........ .... 8001 * .... * 
  0000:07c0 0100060d fef83e00 00000678 0d000000 * ........... x .... * 
  0000:07d0 00000000 00000000 00000000 00000000 * ................ * 
  0000:07e0 00000000 00000000 00000000 00000000 * ................ * 
  0000:07f0 00000000 00000000 00000000 0000 .... * ............ * 


  最后两个字节包含一个55AAH签名。 


  0000:07f0 ........ ........ ........ .... 55aa * .............. U. * 

猜你喜欢

转载自blog.csdn.net/qq_41786318/article/details/79930178