1. 课程导论与实验环境总览

本课程以“从零观察内核启动”为核心目标,带领学员深入理解 Linux 内核从加电到用户空间初始化的完整路径。第一章作为全课程的总纲,首先梳理内核启动的关键阶段,然后介绍 QEMU 模拟器的核心价值,最后给出本课程实验环境的搭建总览,为后续章节的实战调试打下坚实基础。

1.1 Linux 内核启动流程概述

Linux 内核的启动过程可以划分为若干个逻辑阶段,每个阶段都有明确的入口函数和硬件依赖。理解这些阶段的划分,是后续分析启动日志、设置断点、跟踪执行流的前提。

核心观点: 内核启动的本质是“从实模式到保护模式、从汇编到 C 语言、从单核到多核、从内核态到用户态”的渐进式迁移。

下表总结了 Linux 6.1 内核启动的 6 个主要阶段及其关键特征:

阶段 入口/关键文件 模式 主要任务
1. 引导加载 GRUB / UEFI 实模式 加载 bzImage 到内存,跳转到 startup_32
2. 早期 32 位启动 arch/x86/boot/compressed/head_64.S 保护模式 解压内核,设置页表,跳转到 startup_64
3. 64 位内核入口 arch/x86/kernel/head_64.S 长模式 初始化 BSP,设置 IDT/GDT,调用 start_kernel
4. 内核初始化 init/main.c → start_kernel() 长模式 初始化子系统(内存、中断、调度、时间等)
5. 内核线程与驱动 kernel_init() / do_basic_setup() 长模式 加载驱动,挂载根文件系统,启动 init 进程
6. 用户空间初始化 /sbin/init (systemd) 用户态 执行系统服务,启动 shell 或图形界面

下面这张 SVG 流程图展示了从加电到用户空间的完整启动链路,每个节点对应一个关键阶段:

Linux 内核启动流程总览 1. 引导加载 (GRUB) 2. 早期 32 位启动 3. 64 位内核入口 4. 内核初始化 5. 内核线程与驱动 6. 用户空间初始化 说明:本课程将重点在阶段 2-5 设置 QEMU 断点,逐行分析启动日志与执行流。

1.2 QEMU 模拟器简介

QEMU 是一款开源的机器模拟器与虚拟化器,在本课程中扮演“硬件实验室”的角色。与在真实硬件上调试相比,使用 QEMU 具有以下不可替代的优势:

  • 可观测性: 通过 -d in_asm,int,cpu_reset 等日志选项,可以实时输出每条指令的执行情况。
  • 可控制性: 支持 GDB 远程调试,可以在任意指令位置设置断点,单步执行。
  • 可重现性: 相同的 QEMU 版本和内核镜像,在任何宿主机上都能产生一致的启动行为。
  • 零硬件成本: 无需开发板,一台普通 PC 即可模拟 x86_64、ARM、RISC-V 等多种架构。
调试提示: 本课程所有实验均使用 QEMU 的 -s -S 模式启动,即“启动后暂停等待 GDB 连接”,确保学员可以从第一条指令开始跟踪。

下表对比了 QEMU 与真实硬件在调试场景下的关键差异:

对比维度 QEMU 模拟器 真实硬件
启动速度 较快(秒级) 较慢(分钟级)
断点数量 无限制(软件断点) 受硬件调试寄存器限制
日志输出 支持指令级、MMU 级、中断级日志 需要 JTAG/SWD 调试器
快照/回放 支持 savevm/loadvm 不支持
硬件外设 模拟常见设备(virtio、e1000、AHCI) 真实物理设备

下面这张 SVG 图展示了 QEMU 模拟器与宿主机、内核镜像、GDB 调试器之间的交互关系:

QEMU 调试环境架构 宿主机 (Ubuntu 22.04) QEMU 7.2 进程 Linux 6.1 bzImage GDB 调试器 启动日志输出 交互说明 宿主机启动 QEMU 进程 → QEMU 加载 bzImage 并开始模拟执行 → GDB 通过 1234 端口连接 QEMU 进行调试 → QEMU 同时输出启动日志到终端或文件。

1.3 实验环境搭建总览

本课程所有实验均基于以下统一环境,确保学员可以无缝复现每一步操作:

  • 宿主机操作系统: Ubuntu 22.04 LTS (Jammy Jellyfish)
  • QEMU 版本: 7.2.0(从源码编译或使用官方 PPA 安装)
  • Linux 内核版本: 6.1 LTS(从 kernel.org 获取,使用默认 x86_64 配置)
  • 根文件系统: Buildroot 生成的 initramfs,包含 busybox 和基本调试工具
  • 调试工具链: GDB 12.1 + 内核 vmlinux 调试符号
版本一致性警告: 请务必使用与课程完全一致的版本组合(Ubuntu 22.04 + QEMU 7.2 + Linux 6.1)。不同版本之间的 QEMU 命令行选项、内核启动流程、GDB 调试接口可能存在细微差异,导致实验现象与课程描述不符。

下表列出了搭建实验环境所需的 5 个核心步骤,每个步骤将在后续章节中详细展开:

步骤 操作内容 预期产出 对应章节
1 安装 Ubuntu 22.04 并更新系统包 可用的宿主机环境 第 2 章
2 从源码编译 QEMU 7.2.0 qemu-system-x86_64 可执行文件 第 3 章
3 下载并编译 Linux 6.1 内核 arch/x86/boot/bzImage + vmlinux 第 4 章
4 使用 Buildroot 制作 initramfs rootfs.cpio.gz 第 5 章
5 编写启动脚本并验证 QEMU 启动 内核启动日志输出到终端 第 6 章

下面这张 SVG 图以时间线形式展示了实验环境的搭建流程,每个节点代表一个关键产出物:

实验环境搭建时间线 1 Ubuntu 22.04 2 QEMU 7.2 3 Linux 6.1 4 initramfs 5 启动脚本 每个节点代表一个可验证的里程碑,完成前一个节点后再进入下一个,避免环境问题累积。

1.4 本章小结

本章从宏观上建立了课程的知识框架:

  • 理解了 Linux 内核启动的 6 个阶段及其核心任务;
  • 认识了 QEMU 模拟器在调试场景中的独特优势;
  • 明确了本课程实验环境的版本组合与搭建步骤。