操作系统引导过程

文章目录


第一阶段:固件初始化 (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)会有细微差别。

相关推荐
张心独酌2 小时前
Rust开发案例库-静态服务器
服务器·开发语言·rust
起个名字费劲死了2 小时前
QT + Socket 客户端/服务端 公网通讯
服务器·c++·qt·socket
HarmonLTS3 小时前
Python Socket网络通信详解
服务器·python·网络安全
sun0077003 小时前
androd和qnx判断实网卡还是虚网卡
运维·服务器·网络
郝学胜-神的一滴3 小时前
Python数据封装与私有属性:保护你的数据安全
linux·服务器·开发语言·python·程序人生
口嗨农民工3 小时前
live555 sample基本解读
运维·服务器
小宇的天下3 小时前
Synopsys Technology File and Routing Rules Reference Manual (1)
java·服务器·前端
lph0094 小时前
mqtt broker (mosquitto)创建服务器、订阅与发布
运维·服务器
酒醉的胡铁4 小时前
uniapp运行到鸿蒙证书配置
服务器·uni-app·harmonyos