从按下计算机的电源按钮到出现欢迎页,这个过程都发生了什么?
我们知道计算机启动叫boot,重启叫reboot,这里的boot其实是bootstrap的缩写。计算机运行时其硬件交由软件来控制,所以计算机要启动必须要运行软件,但是计算机不启动就无法运行软件,这是一个鸡生蛋和蛋生鸡的过程。
有一句谚语:

“pull oneself up by one’s bootstraps”

意思是说拽着自己的鞋带把自己拉起来。这也充分反映了计算机的启动是一个矛盾的过程,时间久了就简称boot。

计算机启动的过程主要有四个阶段:

一、BIOS

内存包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。开机程序被刷入ROM芯片中,按下电源键之后计算机首先去读取ROM,这段程序被称作基本的输入输出系统(Basic Input/Output System)简称BIOS.

BIOS程序首先检查计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,中止启动。

在BIOS的菜单中有一项『设定启动顺序』,这个启动顺序实际上是一个外部存储设备的排序,在BIOS完成硬件自检后按照这个启动顺序将控制权优先交给排在前面的设备。

二、主引导记录(MBR)

BIOS按照『启动顺序』把控制权交给排在第一个的存储设备。计算机读取该设备的第一个扇区,即前512个字节,并判断该设备是否能用于启动(512个字节的最后两位是不是0x55和0xAA),如果不能则将控制权交给启动顺序中的下一个设备。

这512个字节主要用来告诉计算机哪个分区是激活分区,并将控制权交给激活分区,被称为『主引导记录』(Master boot record),简称MBR。MBR由三部分组成:
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。

一个硬盘可以分成多个分区,其中分区表中记录了硬盘的分区信息。不同的分区可以安装不同的操作系统,因此MBR需要知道将控制权交给哪个分区。

分区表只有64个字节,分为4项,所以一个硬盘最多只能有四个一级分区,即主分区。每一项的16个字节记录的内容为:
(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
(3) 第5个字节:主分区类型。
(4) 第6-8个字节:主分区最后一个扇区的物理位置。
(5) 第9-12字节:该主分区第一个扇区的逻辑地址。
(6) 第13-16字节:主分区的扇区总数。

随着硬盘越来越大四个分区已经不够用了,但分区表只有四项,因此规定其中只有一项可以设置为扩展分区。所谓”扩展分区”,就是指这个区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)。
扩展分区的第一个扇区叫做”扩展引导记录”(Extended boot record),里面也包含了一张分区表,记录着下一个逻辑分区的位置,以此类推,直到某个逻辑分区分区表只包含自己。

三、硬盘启动

此时将计算机的控制权交给硬盘的某个分区了。计算机会读取激活分区的第一个扇区,叫做”卷引导记录”(Volume boot record),VBR告诉计算机操作系统位于该分区的哪个位置,然后计算机加载OS。

特殊情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统,目前常用的启动管理器是Grub。

四、操作系统

最后控制器交给操作系统,首先载入操作系统的内核,例如Linux,先载入/boot下的kernel,然后运行/sbin/init,根据/etc/initab产生PID为1的init进程,他是所有进程的父进程。然后init进程加载各个模块,例如网络、XWindow等,直至运行/bin/login跳出登录界面等待用户输入用户名和密码。

至此,全过程结束。