相关内容
开机过程
开机过程指的是从按下电源键开始, 到进入系统登录画面前所经历的过程.
MBR 与磁盘分区
在目前 x86 的系统架构中, 系统硬盘位于第 0 号磁道: 0 到 511KB 的区块为 MBR(硬盘中的每一个磁道容量为 512KB), 开机管理程序使用这块区域来储存第一阶段开机引导程序(stage1). 接着位于 1 到 62 号磁道作为第 1.5 阶段的开机引导程序(stage1.5), 从第 63 号磁道开始才是操作系统的分区.
主引导记录 (MBR,Master Boot Record) 是位于磁盘最前边的一段引导 (Loader) 代码. 它负责磁盘操作系统 (DOS) 对磁盘进行读写时分区合法性的判别, 分区引导信息的定位, 它由磁盘操作系统 (DOS) 在对硬盘进行初始化时产生.
MBR 的内容分为三部分: 第一部分是 0 到 445KB, 是计算机的基础导引程序, 也称为第一阶段的导引程序; 接着 446KB 到 509KB 为磁盘分区表, 由四个分区表项构成(每个 16 个字节). 负责说明磁盘上的分区情况. 内容包括分区标记, 分区的起始位置, 分区的容量以及分区的类型. 最后一部分为结束标志只占 2KB, 其值为 AA55, 存储时低位在前, 高位在后.
从百度百科借了张图:
MBR 中紧跟在主引导程序后的主分区表这 64 字节 (01BE~01FD) 中包含了许多磁盘分区描述信息, 尤其是 01BE~01CD 这 16 字节, 包含了分区引导标志 bootid, 分区起始源头 beghead, 分区起始扇区 relsect, 分区起始柱面 begcy1, 操作系统类型 systid, 分区结尾磁头 endhead, 分区结尾扇区 begsect, 分区结尾柱面 begcy1, 分区扇区起始位置 relsect, 分区扇区总数 numsect.
其中分区引导标志 bootid 表示当前分区是否可以引导, 若为 0x0, 则表示该分区为非活动区; 若为 0x80, 则为可开机启动区. 若有多个开机启动区, 则由用户开机时的选择而定(如 GRUB 的菜单).
分区扇区起始位置 relsect 表示分区中第一个扇区相对于磁盘起始点的偏移位置.
开机管理程序
Linux 上的开机管理程序有 LiLO 和 GRUB, 前者是早期的产物, 在近年来的 Linux 操作系统都以 GRUB 作为默认软件包.
GNU GRUB(GRand Unified Bootloader 简称 "GRUB")是一个来自 GNU 项目的多操作系统启动程序. GRUB 是多启动规范的实现, 它允许用户可以在计算机内同时拥有多个操作系统, 并在计算机启动时选择希望运行的操作系统. GRUB 可用于选择操作系统分区上的不同内核, 也可用于向这些内核传递启动参数.
运行层级
运行层级 (run level) 共有 7 个, 分别为 0,1,2,3,4,5,6, 其中 0 表示关机, 1 表示单人模式, 6 表示重新启动. 中间的 2,3,4,5 因 Linux 发行商而异.
过程解析
从按下电源开始到登录画面中所有的过程.
登录程序依序分为 BIOS,GRUB, 内核加载, 与 init 程序四个步骤.
BIOS
当按下电源按钮后, 系统就会运行 BIOS 检测, 包含检查系统的硬件配置, 执行系统诊断程序, 找出系统硬盘, 把第 0 号磁道中的开机导引程序加载到内存中, 之后就由 GRUB 接手后续的开机程序.
GRUB
GRUB 是一个较大的程序, 本身容量超过 MBR 的限制(512KB), 因此 GRUB 将开机程序分割为 stage1,stage2, 并在 1 与 2 之中加上选用的程序 stage1.5, 如 e2fs_stage1_5,fat_stage1_5 等.
由 BIOS 接手后的 GRUB, 会由 stage1 转接到 stage2(或 stage1.5), 并找出和载入位于 / boot 的内核文件. 内核文件位于 / boot 之下.
接着会将内存映像文件 (.img) 加载到内存中, 并使用 cpio 命令将内容解压缩到 / boot 之下. 如果硬件的功能都别编入内核中, 这个动作是不需要的; 但若编译为模块且必须在开机时加载, 这个步骤就是必要的.
将内核与必要的映像文件加载后, 系统开机的过程就交给内核处理了.
内核载入
内核接手系统开机的程序之后, 会进行初始化, 包括检测硬件, 设置硬件设备, 时钟设定, 加载模块等, 这动作完成后会释放出曾占用的内存空间.
接着启动文件系统相关的设定, 首先会挂接根目录 ("/"), 再读取分区表(/etc/fstab) 并挂接所有的分区与启动 SWAP. 最后系统启动 / sbin/init 程序, 并运行硬件与软件相关的系统常驻程序.
内核在开机的作用到此告一段落.
init 程序
Init 是系统的第一个进程, 因此 PID 为 0, 也是所有进程的父进程, init 启动后会先执行 etc/rc.d/rc.sysinit, 并读取配置文件 / etc/inittab 中的设定
init 的具体内容可参考:
来源: https://www.cnblogs.com/cyx-b/p/11870197.html