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 启动流程全景图
下图展示了从按下电源键到操作系统运行的核心路径,包含关键节点与数据流向:
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 本章小结
计算机启动是一个环环相扣的接力过程:
- 固件初始化 为硬件提供基本运行环境,并定位引导设备。
- 引导加载 将内核映像从磁盘载入内存,并传递启动参数。
- 内核初始化 完成架构相关设置、核心子系统初始化,并挂载根文件系统。
- 用户空间启动 由 init 进程接管,启动系统服务,最终呈现用户界面。