“探索开机的秘密”


我们知道计算机的主要由 CPU、内存、外存、外部设备等组成,其中 CPU 是计算机的心脏,CPU 从内存中读取指令,一条条不知疲倦的执行,实际上我们所说的内存也就是 RAM 在掉电之后里面的内容 会随之清空,这样开机时 CPU 就不能从内存中正常的读取指令了,怎么办呢?实际上还有一种叫做 ROM 的存储器,ROM 中的内容时可以永久保存的,计算机开机的过程就从 ROM 中开始。

在 8086 系列的计算机启动过程中,计算机处于实模式下,一开始可以访问到的存储空间只有 1M,其中物理地址范围 0xF0000~0XFFFFF 这 64 KB 用于访问 ROM,计算机开机时会自动跳转到这部分空间执行,也就是将代码段寄存器 CS 设置为 0XF000,将指令寄存器 IP 设置为 0XFFF0,将 CS 左移四位加上 IP 就得到了计算机执行的第一条指令的地址 0XFFFF0,从 0XFFFF0 到 0XFFFFF 只有 16 个字节,显然是不够的,因此这里存放的一般是跳转指令 jmp,使处理器从较低的地址空间开始执行。这里 64KB 空间所存放的就是我们通常所说的 BIOS,BIOS 通常用于检查计算机的硬件是否正常,读取键盘的输入以及向屏幕输出等,当然最为重要的是从外存如硬盘中读取操作系统。

现在大部分的计算机都允许安装多个不同的操作系统到不同的硬盘分区上,BIOS 在完成自检以后会从外存上读取最开始的 512 个字节,这 512 个字节叫做主引导记录(MBR),MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader),MBR 的前面 446 个字节用于存放启动代码,最后的 2 个字节是结束标志字,中间的 64 个字节用于存放最多 4 个分区表,这就是为什么我们在安装系统是只能格式化出 4 个主分区的原因。启动代码会告诉计算机从哪一个分区中读取引导扇区的代码。

这里有人可能会有疑问,直接从分区中读取操作系统不就可以了,为啥还要通过引导扇区来读取操作系统,事实上文件系统多种多样,我们不能事先知道操作系统使用的是哪一种文件格式,因此需要多这么一层,引导扇区的一部分代码就是我们常说的 BootLoader,BootLoader 通过文件系统中的配置信息以及额外的启动参数比如以安全模式启动,就可以加载操作系统的内核,到这里计算机从上电到加载操作系统的全部过程就完成了。


参考资料:

Linux开机启动

学堂在线-操作系统