1. 计算机启动概述:从按下电源键到操作系统运行

计算机启动是一个从硬件初始化到软件加载的复杂过程。当用户按下电源键后,系统依次经历固件自检、引导加载、内核解压与初始化,最终将控制权交给操作系统。本章从宏观视角梳理这一完整链条,为后续深入分析 Linux 内核启动细节奠定基础。

核心认知: 启动过程本质上是“硬件自举 → 引导程序加载 → 内核初始化 → 用户空间启动”的四阶段递进。每个阶段都依赖前一阶段提供的运行环境。

1.1 启动流程四阶段

计算机启动可划分为四个逻辑阶段,每个阶段承担不同的职责:

阶段 主要执行者 核心任务 输出产物
第一阶段:固件初始化 BIOS / UEFI 上电自检(POST)、硬件枚举、选择启动设备 启动设备中的引导扇区代码
第二阶段:引导加载 Bootloader(GRUB2 / LILO) 加载内核映像与 initramfs 到内存,传递启动参数 内存中的内核映像与设备树
第三阶段:内核初始化 Linux 内核(start_kernel) 架构初始化、内存管理、调度器、驱动加载 挂载根文件系统,启动 init 进程
第四阶段:用户空间启动 init(systemd / SysVinit) 启动系统服务、网络配置、登录管理器 用户态运行环境
提示: 传统 BIOS 使用 MBR 分区表,最大支持 2TB 磁盘;UEFI 使用 GPT 分区表,支持更大容量并内置安全启动(Secure Boot)。现代 Linux 发行版已全面转向 UEFI + GPT 模式。

1.2 启动流程全景图

下图展示了从按下电源键到操作系统运行的核心路径,包含关键节点与数据流向:

计算机启动流程全景图 计算机启动完整流程(电源键 → 操作系统) ① 按下电源键 BIOS/UEFI 上电自检 枚举硬件设备 ② 读取引导扇区 GRUB2 加载内核 加载 initramfs ③ 内核解压 start_kernel() 挂载根文件系统 ④ init 进程启动 systemd 启动服务 用户登录界面 选择启动设备 跳转到内核入口 执行 /sbin/init 关键时间点 • POST:2~10 秒 • Bootloader:1~3 秒 • 内核初始化:3~15 秒

1.3 各阶段关键动作详解

1.3.1 固件初始化阶段

  • 上电自检(POST): 检测 CPU、内存、显卡、键盘等基本硬件是否正常。若检测失败,通过蜂鸣声或错误码提示。
  • 硬件枚举与资源分配: BIOS/UEFI 为 PCI 设备分配中断号、I/O 地址和内存映射。
  • 启动设备选择: 按用户设定的启动顺序(硬盘、U盘、网络等)查找可引导设备。
  • 加载引导代码: 读取 MBR(传统 BIOS)或 EFI 系统分区中的引导文件(UEFI)。
常见误区: BIOS 和 UEFI 不是操作系统,它们是固化在主板 ROM 中的固件程序。UEFI 本质上是 BIOS 的现代化替代方案,提供图形界面、网络支持和更安全的启动机制。

1.3.2 引导加载阶段

  • Stage 1(MBR): 446 字节的引导代码,负责定位并加载 Stage 2。
  • Stage 2(GRUB2 核心): 位于 /boot/grub 目录,提供文件系统驱动,读取配置文件 grub.cfg。
  • 内核与 initramfs 加载: 将 vmlinuz 和 initramfs 映像复制到内存指定位置。
  • 启动参数传递: 通过内核命令行(如 root=/dev/sda1 quiet splash)告知内核根设备位置和启动模式。

1.3.3 内核初始化阶段

  • 解压内核: 自解压代码将压缩的内核映像(vmlinuz)解压到内存。
  • 架构初始化: 设置页表、中断描述符表、系统时钟。
  • 核心子系统初始化: 内存管理(mm_init)、进程调度(sched_init)、中断系统(init_IRQ)。
  • 驱动加载: 枚举 PCI 设备、注册块设备驱动、挂载 initramfs 作为临时根文件系统。
  • 挂载真正根文件系统: 从指定设备(如 /dev/sda1)挂载根分区,启动 init 进程。

1.3.4 用户空间启动阶段

  • init 进程(PID 1): 所有用户进程的祖先,负责启动系统服务。
  • systemd 并行启动: 按依赖关系并行启动服务单元(.service),显著缩短启动时间。
  • 登录管理器: 启动 getty 或显示管理器(如 GDM、SDDM),呈现登录界面。

1.4 启动流程对比:传统 BIOS vs UEFI

对比维度 传统 BIOS UEFI
固件接口 16 位实模式,中断调用 32/64 位保护模式,C 语言风格接口
分区表 MBR(主引导记录) GPT(GUID 分区表)
磁盘容量 最大 2TB 最大 9.4ZB
引导方式 读取 MBR 中的引导代码 直接读取 EFI 系统分区中的 .efi 文件
安全启动 不支持 支持 Secure Boot(验证签名)
启动速度 较慢(实模式限制) 较快(可直接加载大文件)
实践建议: 在 x86_64 架构上部署 Linux 时,优先选择 UEFI + GPT 模式。使用 lsblk 和 efibootmgr 命令可查看当前系统的启动模式与 EFI 引导条目。

1.5 启动过程中的关键数据结构

内核启动过程中,Bootloader 与内核之间通过特定数据结构传递信息:

数据结构 传递者 内容说明
Boot Params Bootloader → 内核 内存布局、内核命令行、initrd 地址、视频模式
Device Tree Blob Bootloader → 内核 硬件拓扑描述(ARM/嵌入式平台)
EFI System Table UEFI 固件 → 内核 运行时服务、变量访问、时间服务
ACPI Tables 固件 → 内核 电源管理、设备配置、热插拔信息

1.6 本章小结

计算机启动是一个环环相扣的接力过程:

  1. 固件初始化 为硬件提供基本运行环境,并定位引导设备。
  2. 引导加载 将内核映像从磁盘载入内存,并传递启动参数。
  3. 内核初始化 完成架构相关设置、核心子系统初始化,并挂载根文件系统。
  4. 用户空间启动 由 init 进程接管,启动系统服务,最终呈现用户界面。