前言

继 TAB VS SPACE,VIM VS EMACS 等程序员的圣战后,最近又接触了一场新的圣战:systemd VS sysvinit

讲的是 Linux 如何启动第一个程序(PID:1), 本想先说下这一段历史渊源,发现有必要先讲下计算机是如何 boot 起来,所以本篇是个姐妹篇,我们先来聊聊计算机是如何启动的,下篇再来回顾这场圣战!

启动顺序

这个启动顺序是每次开机都会看到的,不管是 Linux 还是 Windows:

boot-sequence

BIOS

首先当你按下 power 键,主机通电了,第一个相应的器件是什么呢?(别说是电源或风扇…)答案是这块东西!

bios-chips

他是一块 ROM,由主板厂商焊死在板上,存放着开机来第一个系统:基本输入输出系统!Basic Input Output System!!BIOS!!!

所以 BIOS 到底干嘛的???说白它就干两件事

  1. 检查硬件能否满足运行的基本条件(CPU, 内存, 硬盘…)
  2. if not OK,主板会发出不同含义的蜂鸣,启动中止
  3. if OK,屏幕就会显示出CPU、内存、硬盘等信息,并把控制权转交给下一阶段的启动程序

MBR

下一阶段的启动程序,那他肯定不是放在 CPU(计算单元),内存(易失性存储器),所以只能是非易失性存储器里了,那可以是 U盘,光碟,或者通常的硬盘(听到硬盘通常都会稍微硬一下以示敬意)这里拿最便宜的机械硬盘来说。

硬盘这么大,哪去找“下一阶段的启动程序”,既然上一步 BIOS 没对 CPU 说,那就只能拿第一个能拿到的区域,就机械硬盘而言,就是第一个扇区了,也就是最开始的 512 个字节,但并不是每一个硬盘的第一个扇区都能启动,它必须是以 0x55, 0xAA 这两个字节结尾的扇区才可以,我们把这种特殊的扇区叫做“主引导记录”!Master Boot Record!!MBR!!!

MBR 只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统!

mbr

上图可见一个硬盘只能分为4个分区,并且必须有且只有一个主分区!叫做”卷引导记录”!Volume boot record!!VBR!!!

但随着有些人喜欢分(系统,学习,工作,音乐,电影,图片,备份1,备份2…)等超过4个分区,MBR 已经满足不了了,所以后来规定了有且只有一个分区设置为“扩展引导记录”!Extended boot record!!EBR!!!(又来一个,我快记不住了)

EBR 包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项),因此,扩展分区可以包含无数个逻辑分区,到此,PROBLEMS SOLVED!

但是,现在没人这么用了,这段为何不用这两种启动方式的历史我懒得去找,反正我从小就是用以下即将要讲的方式!!!

GRUB

这种方式就是,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统,Linux环境中,目前最流行的启动管理器是GRUB:

grub

由用户选择进入哪一个操做系统

Linux Kernel

至此,控制权转交给操作系统后,操作系统的内核首先被载入内存,以Linux系统为例,先载入/boot目录下面的kernel,内核加载完成后,讲启动系统第一个进程(pid:1),其他进程都是它的后代。

init(圣战战场)

且听下回分解

参考

http://huaqianlee.github.io/2015/08/21/Linux/深入理解Linux启动过程 /
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html