操作系统引导过程

文章目录


第一阶段:固件初始化 (BIOS/UEFI)

当你按下电源键,CPU从主板上预定义的地址开始执行代码,这个代码就是固件(Firmware)。

核心任务:

  1. POST 上电自检:检查关键硬件(CPU、内存、显卡、键盘)是否正常工作。听到的"滴"声就是POST码提示。
  2. 初始化硬件:枚举和初始化总线、磁盘控制器等设备。
  3. 确定引导设备:按照预设顺序(如:U盘->硬盘->网络)查找可引导的设备。
  4. 读取并执行主引导记录:对于传统 BIOS,它会读取硬盘的第一个扇区(512字节),即 MBR,并执行其中的第一阶段引导加载程序。对于现代
    UEFI,它直接从硬盘上独立的 FAT 格式 ESP 分区 中加载 .efi 应用程序(如 bootx64.efi),这更快速、更安全。

第二阶段:引导加载程序 (Boot Loader)

此阶段的任务是定位并加载操作系统内核。

以经典的 GRUB2 为例

  1. MBR 中的代码(第一阶段)非常小(仅446字节),其作用只是加载位于 MBR 之后、磁盘第一个分区之前 的 GRUB
    核心镜像(core.img,即第1.5阶段)。
  2. GRUB 核心镜像 包含了必要的文件系统驱动,从而能读取 /boot/grub 目录下的模块和配置文件(grub.cfg)。
  3. GRUB 第二阶段 会解析 grub.cfg,在屏幕上显示引导菜单,让你可以选择不同的内核或操作系统。
  4. 选择后,GRUB 会将选定的 Linux
    内核(vmlinuz-xxx)和初始内存磁盘镜像(initramfs-xxx.img)加载到内存中,然后将控制权交给内核。

initramfs 的关键作用:它是一个临时的根文件系统,包含了内核启动初期必需的驱动(如真正的磁盘驱动、LVM、加密模块)和工具。内核用它来挂载真实的根文件系统。没有它,内核可能无法识别硬盘。

第三阶段:内核初始化

内核被加载到内存并取得控制权后,开始"自举"。

  1. 解压与自解压:内核通常是压缩的,先进行自解压。
  2. 初始化核心子系统:依次初始化调度器、内存管理、中断处理,并最终启动空闲进程(swapper 或 idle)。
  3. 探测硬件与加载驱动:内核基于从固件获取的信息和 initramfs 中的模块,探测硬件并加载驱动。
  4. 挂载根文件系统:内核使用 initramfs 中的工具和驱动,挂载真正的根文件系统(/)。之后,它会卸载 initramfs
    并释放其内存。
  5. 启动第一个用户空间进程:内核从根文件系统上寻找并执行 第一个用户空间进程。对于绝大多数现代Linux系统,这就是
    systemd(其PID为1)。至此,内核引导完成,重心转向用户空间。

第四阶段:用户空间初始化 (由 init/systemd 主导)

systemd(或传统的 sysvinit)作为所有进程的父进程,负责启动整个用户空间环境。

  1. 初始化基本系统:systemd 首先执行 default.target 所指向的一系列基础单元。

  2. 解析运行级别/目标:传统的 sysvinit 会读取 /etc/inittab

    确定运行级别(如3为多用户文本,5为图形)。systemd 则有对应的 multi-user.target 或

    graphical.target。

  3. 执行系统初始化脚本:

    sysvinit:顺序执行 /etc/rc.d/rcX.d/ (X为运行级别)目录下以 S 开头的启动脚本。

    systemd:并行启动各个 .service 单元,效率更高。

  4. 启动关键服务:依次启动文件系统挂载、网络配置、日志服务、计划任务等。

  5. 启动图形界面:如果目标为图形界面,则会启动 显示管理器(如 gdm、lightdm),显示登录窗口。

  6. 用户登录:用户输入凭证后,显示管理器启动桌面环境会话(如GNOME、KDE)或窗口管理器。

故障排查

了解引导过程有助于定位启动失败的问题:

  • 查看日志:使用 journalctl -b 或查看 /var/log/boot.log。
  • GRUB 阶段失败:通常与 MBR 损坏、/boot 分区丢失或 grub.cfg 错误有关。可使用 Live CD 修复。
  • 内核 panic:常见于驱动问题、根文件系统挂载失败。观察 initramfs 是否包含正确驱动。
  • systemd 阶段失败:使用 systemctl --failed 查看失败的服务。

总结

这是一个标准流程,具体的发行版(如Ubuntu、CentOS)或初始化系统(如systemd、upstart)会有细微差别。

相关推荐
Lsir10110_38 分钟前
【Linux】进程信号(下半)
linux·运维·服务器
skywalk81631 小时前
unbound dns解析出现问题,寻求解决之道
运维·服务器·dns·unbound
酉鬼女又兒1 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
skywalk81631 小时前
走近科学:unbound dns域名服务器自己本地解析出现问题,寻求解决之道
运维·服务器·dns·unbound
choke2331 小时前
Python 基础语法精讲:数据类型、运算符与输入输出
java·linux·服务器
AZ996ZA1 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
Web极客码1 小时前
WordPress博客关键词
服务器·wordpress·网站加速
神梦流2 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器
郝学胜-神的一滴4 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生