揭秘 Linux 内核启动过程
Linux 系统的启动过程是现代计算中最复杂的序列之一。它涉及硬件、固件和内核之间的交接,将 CPU 从原始状态过渡到功能齐全的多任务环境。理解这一流程对于系统架构师、内核开发人员以及任何对操作系统实际运行的底层机制感兴趣的人来说都至关重要。
初始交接:从固件到内核
在 Linux 内核接管控制权之前,系统必须经过由系统固件(BIOS 或 UEFI)处理的一系列初始化步骤。固件的主要作用是执行开机自检(POST)并在存储设备上定位引导加载程序(bootloader)。
一旦引导加载程序(例如 GRUB)被执行,它会将压缩的内核镜像——通常称为 bzImage——加载到内存中。bzImage 是一个“大 zImage”,一个自解压的可执行文件,其中包含实际的内核代码,为了节省空间并加快从磁盘加载的速度,这些代码被压缩了。
initrd 的角色与早期启动
启动序列中最关键的组件之一是 initrd(初始 ramdisk)。由于内核需要挂载根文件系统以继续启动,但读取该文件系统所需的驱动程序(例如 SCSI、SATA 或网络驱动程序)可能就位于该文件系统上,因此会出现“先有鸡还是先有蛋”的问题。
initrd 通过提供加载到 RAM 中的临时根文件系统来解决这个问题。这使得内核能够:
- 加载必要的驱动程序。
- 设置环境。
- 在磁盘上或通过网络协议定位并挂载实际的永久根文件系统。
正如参与过 LTSP (Linux Terminal Server Project) 等项目的社区成员所指出的,这种机制使得高级启动场景成为可能,例如通过 TFTP 获取内核并通过 NFS 挂载根文件系统。
过渡到用户空间
一旦内核初始化了其内部数据结构、内存管理和硬件驱动程序,它就达到了启动的最后阶段:启动第一个用户空间进程。
在 Linux 中,这个进程传统上是 init(或者在大多数现代发行版中是 systemd)。内核从内核模式切换到用户模式,有效地将系统的控制权移交给用户空间初始化系统,随后由该系统管理其余的系统服务和登录 shell。
结论
虽然 Linux 内核启动过程是对底层系统编程的深入探索,但它揭示了操作系统管理从原始硬件到高级运行环境过渡的优雅方式。从 bzImage 的解压缩到 initrd 提供的临时桥梁,每一步都是经过计算的步骤,以确保系统达到稳定、可用的状态。