Linux 启动流程:硬件通电到加载内核
前言
继 TAB VS SPACE,VIM VS EMACS 等程序员的圣战后,最近又接触了一场新的圣战:systemd VS sysvinit
讲的是 Linux 如何启动第一个程序(PID:1), 本想先说下这一段历史渊源,发现有必要先讲下计算机是如何 boot 起来,所以本篇是个姐妹篇,我们先来聊聊计算机是如何启动的,下篇再来回顾这场圣战!
启动顺序
这个启动顺序是每次开机都会看到的,不管是 Linux 还是 Windows:
BIOS
首先当你按下 power 键,主机通电了,第一个相应的器件是什么呢?(别说是电源或风扇…)答案是这块东西!
他是一块 ROM,由主板厂商焊死在板上,存放着开机来第一个系统:基本输入输出系统!Basic Input Output System!!BIOS!!!
所以 BIOS 到底干嘛的???说白它就干两件事
- 检查硬件能否满足运行的基本条件(CPU, 内存, 硬盘…)
- if not OK,主板会发出不同含义的蜂鸣,启动中止
- if OK,屏幕就会显示出CPU、内存、硬盘等信息,并把控制权转交给下一阶段的启动程序
MBR
下一阶段的启动程序,那他肯定不是放在 CPU(计算单元),内存(易失性存储器),所以只能是非易失性存储器里了,那可以是 U盘,光碟,或者通常的硬盘(听到硬盘通常都会稍微硬一下以示敬意)这里拿最便宜的机械硬盘来说。
硬盘这么大,哪去找“下一阶段的启动程序”,既然上一步 BIOS 没对 CPU 说,那就只能拿第一个能拿到的区域,就机械硬盘而言,就是第一个扇区了,也就是最开始的 512 个字节,但并不是每一个硬盘的第一个扇区都能启动,它必须是以 0x55, 0xAA 这两个字节结尾的扇区才可以,我们把这种特殊的扇区叫做“主引导记录”!Master Boot Record!!MBR!!!
MBR 只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统!
上图可见一个硬盘只能分为4个分区,并且必须有且只有一个主分区!叫做”卷引导记录”!Volume boot record!!VBR!!!
但随着有些人喜欢分(系统,学习,工作,音乐,电影,图片,备份1,备份2…)等超过4个分区,MBR 已经满足不了了,所以后来规定了有且只有一个分区设置为“扩展引导记录”!Extended boot record!!EBR!!!(又来一个,我快记不住了)
EBR 包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项),因此,扩展分区可以包含无数个逻辑分区,到此,PROBLEMS SOLVED!
但是,现在没人这么用了,这段为何不用这两种启动方式的历史我懒得去找,反正我从小就是用以下即将要讲的方式!!!
GRUB
这种方式就是,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统,Linux环境中,目前最流行的启动管理器是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