从按下电源到桌面:开机全流程

上一篇 01-计算机硬件速览 的 BIOS 段落留了个尾巴:"系统启动后,管家交权给操作系统"。这篇把交权现场完整演一遍:按下电源到桌面亮起,中间那几十秒到底发生了什么。这也是硬件区通向 操作系统 的桥。

一、按下电源那一刻:第一条指令从哪来

悖论开场:CPU 是万能的,但它刚醒时内存是空的(RAM 断电即失忆),硬盘还没人驱动。CPU 想执行程序,程序在哪?

硬件工程师早安排好了:CPU 上电复位后,从固定地址取第一条指令(x86 是 0xFFFF0 附近),那片地址不在内存,在 ROM 里——BIOS 就躺在这。上一篇的"代理管家",正式出场。

整个开机就是一场接力赛:BIOS → 引导程序 → 内核 → init → 桌面。每一棒只干一件事:找到下一棒,交出去

二、POST:先体检再干活

BIOS 接手第一件事是 POST(Power-On Self-Test,上电自检)

  • 逐个检查 CPU、内存、键盘、显卡、磁盘
  • CMOS 读硬件配置(纽扣电池维持的那块芯片)
  • 自检过不了就"哔——"报警。老主板能听声辨故障(一长两短多半是显卡)

自检通过,屏幕亮起厂商 Logo,管家开始物色"谁来当系统"。

三、BIOS 与 UEFI:两代管家

BIOS(传统) UEFI(现代,2010 后主流)
设置界面 蓝底白字,纯键盘 图形界面,能用鼠标
磁盘/分区 配 MBR,最大 2TB 配 GPT,超大硬盘
引导程序位置 裸藏在磁盘第一个扇区 独立 ESP 分区(FAT32)里的 .efi 文件
安全 Secure Boot(校验引导程序签名,防病毒抢跑)
运行模式 16 位实模式起步 直接 32/64 位

💡 UEFI 的引导程序成了正经"文件",所以 UEFI 主板可以联网更新固件、装驱动——这在 BIOS 时代不可想象。2026 年买到的电脑几乎全是 UEFI,BIOS 只是历史课。

四、找引导设备:MBR 与 GPT

固件按你在 setup 里设的顺序(U 盘优先?硬盘优先?装系统改启动项就是在这)逐个探测,找到后读设备的"目录牌":

MBR(主引导记录)——磁盘第 0 个扇区,512 字节,寸土寸金:

446 字节   引导代码(固件从这开始执行)
 64 字节   分区表(4 条 × 16 字节 → 最多 4 个主分区)
  2 字节   魔数 0x55AA("此扇区有效"的签名)

2TB 限制怎么来的:分区表里的 LBA 地址只有 32 位,2³² × 512B = 2TB,天花板焊死。

GPT(GUID 分区表)用 64 位地址 + UUID 标识分区,还在磁盘末尾存了一份备份表头——开头坏了读结尾照样活。所以大硬盘 + 现代系统,GPT 是必选项。

五、引导程序:GRUB 与 bootmgr

446 字节装不下"认识文件系统"的逻辑,于是接力继续分两棒:

  • 第一阶段(MBR 里的 446 字节):只干一件事——找到并加载第二阶段
  • 第二阶段:真正的引导程序。Linux 是 GRUB(让你选系统/内核的菜单就是它),随后把内核文件 vmlinuz 和配套的 initramfs 搬进内存;Windows 是 bootmgr,读 BCD 配置后加载 winload

装过双系统的都见过 GRUB 菜单——那一刻做选择的,就是引导程序。

六、内核接管:鸡生蛋问题与 initramfs

GRUB 把内核解压进内存,CPU 跳到内核入口——操作系统正式登场,固件退居幕后(留下一份硬件清单给内核)。

内核的第一道坎是个死结:挂载根文件系统(读全量驱动)需要磁盘驱动,而磁盘驱动就在盘上——鸡生蛋。

Linux 的解法是 initramfs:引导程序额外加载一个微型"临时根文件系统"进内存,里面放着最基本的驱动;内核先用它把硬盘驱动装好、挂上真正的根分区,然后 initramfs 功成身退。临时工转正后下车。

七、1 号进程:从内核到用户世界

内核初始化完内存管理、调度器、各类子系统后,创建系统第一个用户态进程——PID 1

  • 现代 Linux 发行版:systemd。把旧时代串行执行的启动脚本,换成一张依赖图并行拉起服务(网络、日志、SSH……),开机速度的飞跃主要归功于这
  • systemd 按 target(旧称 runlevel)决定拉起哪些服务

最后 systemd 拉起显示管理器(GDM 等)→ 登录界面 → 输密码 → 桌面环境点亮。你按下的电源,经过 固件 → 引导程序 → 内核 → systemd → 桌面 五级接力,跑完全程。

八、三大系统对照表

阶段 Windows Linux macOS
固件 BIOS/UEFI BIOS/UEFI Intel 时代 UEFI;Apple 芯片走自家 iBoot
引导 bootmgr + BCD GRUB boot.efi
内核 ntoskrnl.exe vmlinuz XNU
1 号进程 smss/wininit + services systemd launchd
桌面 Explorer GNOME/KDE… Aqua(Finder/Dock)

💡 macOS 的 launchd 和 systemd 设计哲学异曲同工:把"开机启动谁"从一串脚本,变成一组声明式配置,谁依赖谁写得明明白白。

九、顺带说清:睡眠、休眠、重启

动作 内存 硬盘 恢复速度
睡眠(Suspend to RAM) 保电 不涉及 秒醒
休眠(Hibernate) 断电 内存完整快照写入硬盘 较慢(要读回)
重启 全部重来 最慢

Windows 的"快速启动"= 关机时把内核会话休眠进硬盘,下次开机跳过部分初始化。所以有个经典怪象:"重启能修的问题,关机再开修不了"——因为那种关机不是真关。

十、盲点自测

  1. 内存断电即空,CPU 第一条指令从哪来? ——复位后从固定地址取指,那里是 ROM 里的固件(BIOS/UEFI)。
  2. MBR 为什么最多 4 主分区、最大 2TB? ——64 字节分区表只装得下 4 条记录;LBA 32 位 × 512B = 2TB。GPT 两个都解决。
  3. initramfs 解开什么死结? ——挂根文件系统要磁盘驱动,驱动又在盘上。initramfs 是进内存的临时根,装好驱动挂上真根后功成身退。
  4. PID 1 是谁?挂了会怎样? ——systemd(Linux)/ launchd(macOS)是所有用户进程的祖先;1 号进程退出,内核直接 panic。
  5. UEFI 比 BIOS 多了什么? ——图形界面、GPT 大硬盘、ESP 分区、Secure Boot 签名校验、联网更新固件。
  6. 睡眠和休眠差在哪? ——睡眠给内存保电(RAM 持续供电);休眠把内存快照写进硬盘后彻底断电,更省电但恢复慢。
  7. 为什么"关机再开"有时修不了"重启"能修的问题? ——Windows 快速启动让关机保留了内核会话(半休眠状态),重启才是完整初始化。

十一、动手玩一把

# Linux(systemd 系):开机各阶段耗时
systemd-analyze                # firmware / loader / kernel / userspace 总账
systemd-analyze blame | head   # 谁拖慢了开机

# macOS:历史开机记录
last reboot | head

# 判断本机是 UEFI 还是 BIOS(Linux)
[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

# macOS 看引导固件信息
system_profiler SPHardwareDataType | grep -i boot

部件全认识了,也看着它们集体开了工。但部件之间到底靠什么"对话"?补上最后一块硬件拼图 → 03-总线与接口

⬅️ 计算机硬件速览 🏠 00-基础与理论 ➡️ 总线与接口