计算机启动过程
BOOTSTRAP
计算机启动被称作 BOOT,我们会在开机时看到在显示器上的第一行就是 BOOT,但它的翻译的意思是靴子,BOOT 来自于一个单词 BOOTSTRAP。
BOOTSTRAP 的意思是 靴带,来自短语:“Pull oneself up by one’s bootstrap”——用靴带将自己拉起来
计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序,最后只能将一小段程序装进内存,然后计算机才能正常运行。
流程图
流程
上电
按下电源开关,首先通电的是主板,主板控制芯片组会向 CPU 发送 reset 信号,当稳定供电后撤回信号,CPU 从 FFFF0H 处执行指令,跳转到 BIOS 的地址范围
BIOS
BIOS 启动,先进行自检,检查内存、显卡、磁盘等关键设备是否存在功能异常,会有蜂鸣器汇报错误,无错误自检飞快结束
BIOS 调用显卡 BIOS 代码,通常在 C0000H 处(此时显示器已经可以显示显卡 BIOS 程序信息,或许是个 logo?)
BIOS 调用其他关键设备的 BIOS 代码来初始化他们
启动顺序
BIOS 将控制权交给其他设备,可以是硬盘,U盘或者网络,BIOS 会尝试一一尝试启动他们,知道成功或者最终关闭或重启。
主引导记录
BIOS 会从可使用启动顺序的第一位存储设备中读取设备的 MBR,并将程序放到内存的 0x7C000 的内存中,并跳转到扇区的引导程序中执行。
MBR 的第 447-510 共 64 字节保存的是分区表,即将硬盘分为若干个区,一个硬盘最多分四个主分区,每个 16 字节,主分区里只有一个是激活分区,用于接收 BIOS 的控制权,第一个字节位 0x80 即表示为激活分区。
硬盘启动
-
卷引导记录
计算机读取激活分区的第一个扇区——卷引导记录 VBR
-
拓展分区和逻辑分区
分区里的分区被称为逻辑分区
除了可激活分区,还可以仅有一个区可以被定义为拓展分区,拓展分区第一个扇区——拓展引导记录包含一张 64 字节分区表,但最多只能有两个逻辑分区,但是可以通过第二个逻辑分区的第一个扇区的分区表中找到第三个逻辑分区地址,直至某个逻辑分区仅有自己,所以,拓展分区可以包含无数个逻辑分区
实际上很少通过这种方式启动操作系统。
-
启动管理器
计算机读取主引导记录前 446 字节后,暂时不交出控制权,而是运行实现安装的“启动管理器”,交由用户选择启动哪一个操作系统。
操作系统
选择想要进入的操作系统,控制权交给操作系统,引导程序会将存储设备中的操作系统内核载入内存,待到系统内核完成初始化后,即可供用户交互。
一些名词解释
RTC
RTC(Real-Time Clock)实时时钟芯片,一般由主板电池供电,在主板未完全通电时一直执行,有时会出现主板电池电压不足导致系统时间变慢的情况。
CMOS
CMOS(Complementary-Metal-OxideSemiconductor)互补金属氧化物半导体,一般指电脑上主板 PCH 南桥芯片的 RAM 可读写存储器,用于存储计算机基本启动信息(日期、时间、启动设置)。
EC
EC(Embedded-Controller)嵌入式控制器,与 BIOS 合作控制指示灯风扇等等。
South Bridge
South Bridge南桥芯片,一般位于 PCI 插槽附近,进行输入输出的控制,发展方向主要是集成更多的功能——网卡、RAID、IEEE 13294、WIFI 等。
BIOS
BIOS(Basic-Input/Output-System)基本输入输出系统——一组保存着计算机最重要的基本输入输出的程序、开机后自检程序、系统自启动程序,并固化到计算机内主板上的一个ROM芯片上的程序。
BOOTLOADER
BOOTLOADER操作系统引导,操作系统运行之前运行的一段小程序,用于初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。
stage1 使用汇编语言编写,工作为:
- 初始化硬件设备、
- 为加载Bootloader的stage2准备RAM空间
- 拷贝Bootloader的stage2到RAM空间
- 设置好堆栈段为stager2的C语言环境做准备。
stage2 使用 C 语言编写,工作为:
- 初始化本阶段要使用到的硬件设备
- 将内核映像和根文件系统映像从 flash 上读到RAM
- 调用内核
普通的 bootloader 需要实现:
- 初始化硬件设备
- 为操作系统准备RAM空间
- 将操作系统代码载入到RAM中
- 设置堆栈执行环境,为高级语言(如 C 语言)提供执行环境。这里要多说一句,操作系统并不都是 C 语言写的哦。现在 Rust 语言接近 C 语言性能,并且因为其提供的安全性,已经被用来写操作系统了。
- 将控制权交给操作系统。到这一步,系统的完整启动也就结束啦。之后就是操作系统主宰的世界了!