从按下电源到桌面:开机全流程
上一篇 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 的"快速启动"= 关机时把内核会话休眠进硬盘,下次开机跳过部分初始化。所以有个经典怪象:"重启能修的问题,关机再开修不了"——因为那种关机不是真关。
十、盲点自测
- 内存断电即空,CPU 第一条指令从哪来? ——复位后从固定地址取指,那里是 ROM 里的固件(BIOS/UEFI)。
- MBR 为什么最多 4 主分区、最大 2TB? ——64 字节分区表只装得下 4 条记录;LBA 32 位 × 512B = 2TB。GPT 两个都解决。
- initramfs 解开什么死结? ——挂根文件系统要磁盘驱动,驱动又在盘上。initramfs 是进内存的临时根,装好驱动挂上真根后功成身退。
- PID 1 是谁?挂了会怎样? ——systemd(Linux)/ launchd(macOS)是所有用户进程的祖先;1 号进程退出,内核直接 panic。
- UEFI 比 BIOS 多了什么? ——图形界面、GPT 大硬盘、ESP 分区、Secure Boot 签名校验、联网更新固件。
- 睡眠和休眠差在哪? ——睡眠给内存保电(RAM 持续供电);休眠把内存快照写进硬盘后彻底断电,更省电但恢复慢。
- 为什么"关机再开"有时修不了"重启"能修的问题? ——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-总线与接口
💬 评论