bootstrap(引导)原理剖析

计算机程序的运行有编译、连接、装入的过程,在操作系统里,程序文件通过用户指定,由操作系统装入执行。

那么同样作为计算机程序的操作系统如何被装入执行呢?

答案是bootstrap loader。bootstrap的原意是“to improve your situation yourself, without help from other people”,比较准确的翻译是自举,即自我增长。bootstrap loader根据内置的逻辑(有时还有配置文件),从指定存储媒介的指定位置里读取操作系统的相关代码,载入内存执行。

那bootstrap loader自己呢?这是因为计算机最初启动的时候会载入一个基本输入输出系统(BIOS),这个系统能够从指定位置读取和载入boot loader。

至于BIOS的载入,这似乎是个完全寻根究底的问题,因为一切的程序逻辑最终都要回归到硬件逻辑上来。这是CPU本身启动初始化的一个内在逻辑——它通电后就马上要从主板上这样一个存储器里(现在通常是闪存)载入BIOS。

在此,我们得出以下的引导流程图:

CPU → BIOS → bootstrap loader → kernel

可以看出从CPU加到真正的系统内核载入经过了繁琐的过程,因此现在有不少人在简化这个过程,以提高系统的启动速度。google的chrome os笔记本就是如此,还有coreboot。

coreboot似乎是一个十分优雅的解决方案,它将kernel启动之前的计算机用一个“高级输入输出系统”来管理,这样能够系统化地支持大量的内核启动前的高级操作,同时又能做好操作系统启动之前的访问控制。

从原理上说,甚至可以直接从CPU引导内核,不过这样将导致机器的严重特化,而失去可定制性。

虽然引导的过程是如此的繁琐,然而却给玩家提供了广阔的定制空间。在kernel启动之前,CPU(i386和amd64)处于实模式阶段,只要CPU一直处于实模式状态,就依然具备接着引导kernel的能力。于是,保持着实模式状态,boot loader可以做各种有趣的事,下面列举几种:

  1. 多系统入口切换;
  2. 网络支持;
  3. USB支持;
  4. 构建虚拟BIOS环境;
  5. 硬件检测;
  6. 等等……