Linux PC 开机全过程

1.3 软件复位

软件复位
软件复位主要由BIOS或者UEFI负责,相关内容不是本文的重点。我会在全文完成以后,视情况扩展本章内容。

软件复位的最后一步

BIOS通过调用位于BIOS内部的一个boot handler 地址尝试从BAID启动。从设备加载启动扇区并且移交控制权的责任就落在boot handler进程身上。如果设备未能启动,它应该唤起INT 18h中断,因为这是个启动恢复向量。
当boot handler被调用,BIOS传递一个指针到ES:DI中的PnP Installation Check Structure。这是因为一旦boot handler成功加载设备的启动扇区到内存地址0000:7C00h处,执行控制权就可以通过下列寄存器值来移交:

为什么刚好是07c00h?
据说是由于当年DOS最小需要32KB内存。BIOS加载启动扇区就512字节了,再分512字节给启动扇区的软件运行,刚好1KB。当bootloader把控制权移交给操作系统,这1KB就不用保留了,可以当空闲内存随便用。这个时候很自然地会把这1KB安排到32KB的末尾,也就是从第31KB开始占用1KB。十进制的31K就是十六进制的07c00h由于兼容性原因,这个魔法值就一直保留至今。
BootLoader
由于BootLoader的多样性,以及采用UEFI的设备已经可以跳过BootLoader直接引导Linux内核,本章内容今后视情况扩展
以前,启动扇区的代码属于操作系统的一部分,也就是BIOS-->Linux。但是这么做有一个明显的坏处,比如说我们想在硬盘上再安装一个操作系统,BIOS-->FreeBSD,那么只有后来安装的操作系统可以启动,因为启动扇区被覆盖了。为了解决多个操作系统争抢启动扇区的问题,同时允许用户在开机时选择启动不同的操作系统,BootLoader就应运而生了。不仅如此,加载操作系统内核到内存,然后移交控制权这件事情,真的是一件枯燥乏味的脏活累活。有了BootLoader,操作系统的第一行代码就可以假设自己已经被BootLoader复制到了内存中特定的位置。