解决困扰已久的系统启动过程,可以帮助使多系统共存,而不影响各自启动!
Boot Sector
结构、系统启动过程简介
一. Boot Sector 的组成
Boot Sector 也就是硬盘的第一个扇区(注1:0柱面,0磁道,1扇区) (注2: 1磁道=16扇区,1扇区=512字节), 它由 MBR (Master Boot Record), DPT (Disk Partition Table) 和 Boot Record ID 三部分组成.
MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ),
存放系统主引导程序 (它负责检查硬盘分区表、寻找可引导分区并负责将可引导分区的引导扇区(DBR)装入内存).
DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区
信息. 主分区表分为四个分区项, 每项 16 字节, 分别记录了每个主分区的信息
(因此最多可以有四个主分区).
Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法
引导区, 它等于 0xAA55, 这是判别引导区是否合法的标志.
Boot Sector 的具体结构如下图所示:
0000 |------------------------------------------------|
| |
| |
| Master Boot Record |
| |
| |
| 主引导记录(446字节) |
| |
| |
| |
01BD | |
01BE |------------------------------------------------|
| |
01CD | 分区信息 1(16字节) |
01CE |------------------------------------------------|
| |
01DD | 分区信息 2(16字节) |
01DE |------------------------------------------------|
| |
01ED | 分区信息 3(16字节) |
01EE |------------------------------------------------|
| |
01FD | 分区信息 4(16字节) |
|------------------------------------------------|
| 01FE | 01FF |
| 55 | AA |
|------------------------------------------------|
二. 系统启动过程简介
系统启动过程主要由一下几步组成(以硬盘启动为例):
1. 开机
2. BIOS 加电自检 ( Power On Self Test -- POST )
内存地址为 0ffff:0000
3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)
读入内存地址 0000:7c00 处.(注3:遇到最后两个字节55 AA读入内存执行)
4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于
则转去尝试其他启动介质, 如果没有其他启动介质则显示
"No ROM BASIC" 然后死机.
5. 跳转到 0000:7c00 处执行 MBR 中的程序.
6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动
分区或有不止一个活动分区, 则转停止.
8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.
(注4:在分区表的四个记录中,一般来说有且只有一个记录的标记是活动的,MBR(主要负责从活动分区中装载并运行系统引导程序)会去找到这个分区记录,根据记录的起始扇区加载该分区的逻辑 0 扇区(起始扇区)的内容到 0x07C0:0000,并且执行 JUMP 0x07C0:0000(按照规范,BOOT RECORD 也应该从 0x07C0:0000
处开始执行,所以 MBR 通常都要先将自己搬移,以腾出位置去加载 BOOT RECORD)。控制权切换到 BOOT RECORD。BOOT
RECORD(包括boot loader如grub或lilo 等)以 linux 为例,它会读取 linux 内核镜像到地址
0x9000:0000,然后开始切换到 0x9000:0000 继续运行。 以 MS-DOS 为例,则它会读取文件系统根目录下的 IO.SYS
和 MSDOS.SYS 两个文件然后加载到内存中继续运行。)
9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则
显示 "Missing Operating System" 然后停止, 或尝试
软盘启动.
10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
11. 启动系统 ...
以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10
步由MBR中的引导程序完成.
一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等)
都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序
之前让用户选择要启动的分区.
而某些系统自带的多系统引导程序 (如 lilo, NT Loader 等)
则可以将自己的引导程序放在系统所处分区的第一个扇区中, 在 Linux
中即为 SuperBlock (其实 SuperBlock 是两个扇区).
注: 以上各步骤中使用的是标准 MBR, 其他多系统引导程序的引导过程与此不同.
注5:一些早期的引导型病毒,以及某些 bootloader,还有些硬盘加密卡,他们会修改 MBR,做个“钩子”出来。