本课属于 第一阶段 · 走进操作系统(第 1~5 课)

上一课我们说:操作系统是所有程序脚下的地基。这一课,我们把镜头拉到最早的那个瞬间——你按下电源键,到屏幕上蹦出 login: 提示符,中间到底发生了什么。这是一场惊险的接力赛。


从一个"黑屏"说起

你现在做一个动作:按下电脑的电源键。

那一瞬间,屏幕还是黑的,但机器内部已经忙疯了。如果你能把这一两秒钟放慢一万倍,你会看到一场配合严丝合缝的接力赛,一共有四棒:

  1. 固件(BIOS/UEFI)——第一棒,负责"开机体检 + 找人接手";
  2. 引导程序(Bootloader)——第二棒,负责"把内核搬进内存";
  3. 内核 + initramfs——第三棒,负责"把系统真正跑起来";
  4. init / systemd——第四棒,负责"拉起所有服务和登录界面"。

你最终看到的那个能打字的 shell,是这四棒接力全部跑完的结果。任何一棒掉链子,你的电脑就只会卡在黑屏,或者给你一个冷冰冰的报错。

下面我们一棒一棒拆开看。


2.1 第一棒:上电到 BIOS/UEFI

你按下电源键,电流涌进主板。CPU 被"唤醒"了。

但 CPU 醒来的第一件事,不是去执行你硬盘里的操作系统——它根本还不知道操作系统在哪。CPU 有一个"出厂设定":醒来后,从内存里一个固定的地址开始执行第一条指令。

这个固定地址上放的,是主板上一小块芯片里的代码,它叫固件(Firmware)。在老一点的机器上它叫 BIOS,在新一点的机器上它叫 UEFI

一句话理解:固件是焊在主板上的"第一段代码",CPU 一上电就跑它,就像人一睁眼先本能地看"我是谁、我在哪"。

固件干的第一件事叫 POST(Power-On Self-Test,加电自检)

  • CPU 还在不在?内存还好吗?
  • 键盘、显示器连上了吗?
  • 有没有显卡、有没有可启动的磁盘?

自检通过后,固件开始"找人接手"——它按照一个启动顺序(Boot Order),挨个去问:U 盘?光盘?硬盘?网卡?谁的启动扇区里有引导程序,就把它加载进来。

你装系统时按 F12Del 进去看到的那个"选从哪启动"的菜单,就是这个环节。

2.2 第二棒:引导程序(Bootloader)

固件找到硬盘后,从硬盘最开头的一小块区域(叫启动扇区)里,读出来一小段程序——这就是引导程序(Bootloader)

引导程序的任务很明确,一句话:

把躺在磁盘上的内核,加载到内存里,然后跳进去执行。

听上去简单,但引导程序其实挺讲究,因为这时候有个尴尬:内核文件在磁盘上,可磁盘的文件系统(比如 ext4、NTFS)本身还没被"读懂"。引导程序得先自己想办法,在没人帮的情况下,摸清楚"内核文件存在磁盘的哪个扇区",把它读进内存。

Linux 世界最常用的引导程序叫 GRUB(GRand Unified Bootloader)。你装双系统(Windows + Linux)时,开机看到的那个选择菜单——"进 Ubuntu 还是进 Windows"——就是 GRUB 弹出来的。

一句话理解:Bootloader 是"搬运工",把内核从磁盘搬到内存,再把 CPU 的控制权交出去。

这里你可能会问:为什么要把"引导"单独拆成一个环节,固件直接加载内核不行吗?

原因是职责分离。固件是主板厂商写的,它要兼容无数种情况,所以做得"笨而通用";而引导程序是操作系统这一方写的,它更聪明,能支持多系统菜单、能记住你上次选了哪个、能加载不同版本的内核。把"通用体检"和"专门引导"分开,两边各自演进而互不拖累。


2.3 第三棒:内核启动与 initramfs

GRUB 把内核搬进内存、跳进去执行之后,内核就"活了"。

但内核刚活过来,马上撞上一个鸡生蛋、蛋生鸡的死结:

  • 内核要挂载硬盘上的根文件系统(就是那个 / 目录,你所有文件、程序、配置都在里面);
  • 但读硬盘,需要磁盘驱动
  • 而磁盘驱动,作为内核模块,又躺在硬盘的根文件系统里……

内核说:"我得先读硬盘才能拿到驱动,可没驱动我读不了硬盘。"——死锁了。

怎么破?答案是 initramfs

一句话理解:内核先在一个临时的小文件系统里跑起来,这个小系统里提前塞好了必需的驱动(尤其是磁盘驱动),内核用它先"学会认硬盘",再挂载真正的根文件系统。

initramfsinit + ram + fs 三个词的合体:一个加载到内存(RAM)里、用于初始化(init)的文件系统(fs)

流程是这样的:

  1. GRUB 加载内核时,同时把一个打包好的 initramfs(通常是个 .img.cpio 文件)也塞进内存;
  2. 内核先解压、挂载这个 initramfs,把它当作临时的根文件系统;
  3. initramfs 里有磁盘驱动、有工具,内核加载驱动,成功"认"出了硬盘;
  4. 内核把真正的根文件系统挂载到 /,然后卸下临时系统,正式上岗。
你开机时如果看到很短暂的几行文字闪过,比如 Loading initial ramdisk ...,那就是 initramfs 在工作。

2.4 第四棒:init / systemd——第一个进程

内核把真正的根文件系统挂载好之后,要启动的第一个用户态进程,就是 init

一句话理解:init 是内核启动的第一个进程,它的 PID 永远是 1,负责拉起系统里其余的一切:后台服务、网络、登录界面。

为什么 PID 是 1?因为进程编号从 1 开始,init 是第一个,所以占了这个"元老"号码。而且 PID 1 有个特殊待遇:它是所有进程的"老祖宗"——后面所有进程,要么是它直接启动的,要么是它的子孙。它要是挂了,整个系统基本也就瘫了(我们第 5 课会详细说进程的"父子"关系)。

现代 Linux 上,init 这个角色大多由 systemd 扮演。

systemd 管服务的方式很有条理:它把每个服务定义成一个单元(unit),比如 ssh.servicenginx.servicenetwork.target。它负责按依赖关系、按顺序,把这些单元一个个拉起来,出问题了还能帮你重启、记录日志。

你可以用 systemctl 这个命令随时"视察"它:

systemctl status ssh     # 看 ssh 服务现在的状态
systemctl list-units --type=service   # 看 systemd 一共管着哪些服务

动手实验:亲自验证这一整条链路

前面的流程你不用死记,Linux 把每一步都"留了底",你随时可以回看。打开终端,逐条执行:

# 1. 内核启动时收到了哪些参数(你开机菜单选的那项,就藏在这里面)
cat /proc/cmdline

# 2. 现在跑的是哪个内核版本
cat /proc/version

# 3. PID 1 到底是什么程序(多半指向 /usr/lib/systemd/systemd)
ls -l /proc/1/exe

# 4. systemd 管了哪些服务(只看前 10 个)
systemctl list-units --type=service | head

# 5. 开机引导日志里,看内核和 initramfs 的痕迹(dmesg 是"内核消息")
dmesg | grep -i -E "bios|uefi|initramfs|systemd" | head

第五条特别值得玩味:dmesg 输出的是内核启动时一路"自言自语"的记录。你几乎能把上面讲的四棒接力,在内核日志里一段一段对号入座。


深入点:两个常被搞混的概念

① UEFI 和 BIOS 到底差在哪?

BIOS 是上世纪的老设计,UEFI 是它的现代接班人。关键区别:

BIOSUEFI
界面纯键盘、蓝底白字支持鼠标、图形界面
磁盘传统 MBR,最大约 2TB支持 GPT,超大磁盘
安全支持 Secure Boot(安全启动)
地位正在被淘汰现在的主流

简单说:BIOS 是老将,UEFI 是新人,但 UEFI 全面更强,如今买的新电脑几乎都是 UEFI。

② Linux 和"操作系统"是一回事吗?

严格说,不是。

Linux 只是"内核"。它负责进程、内存、文件、设备这些底层管理,但它不包含你平时用的 lsbashgcc 这些命令和工具——那些是 GNU 项目等贡献的。

内核 + 一堆工具 + 包管理器 + systemd,打包在一起,才叫一个发行版(distribution),比如 Ubuntu、Debian、CentOS。

所以有些人会较真地说,完整应该叫 GNU/Linux。这个说法有道理:Linux 提供"发动机",GNU 提供"车壳和方向盘",合起来才是一辆能开的车。

这一课我们反复用"Linux"指代整套系统,这是口语习惯;但你心里要清楚,严格意义上的 Linux,只是那颗内核

小结与思考题

这一课,我们把开机四棒接力捋清楚了:

上电 → 固件(BIOS/UEFI) → 引导程序(GRUB) → 内核+initramfs → init/systemd → 登录提示符
  • 固件负责体检和找人;
  • 引导程序负责把内核搬进内存;
  • initramfs解决"先有鸡还是先有蛋"的磁盘驱动死结;
  • init/systemd(PID 1)负责拉起整个用户态世界。

留三个问题给你:

  1. 用你自己的话,把开机流程讲给一个"完全不懂电脑"的人听,不超过 5 句话
  2. PID 1 为什么这么特殊?如果它被 kill 掉了,系统会怎样?(提示:想想"祖先进程"的身份)
  3. 什么是"鸡生蛋"问题?initramfs 是怎么打破这个死结的?
下一课,我们要认识操作系统真正的"发动机":中断与异常。你敲一下键盘、网卡收到一个包、程序除以零——所有这些"突发事件",都是靠同一个机制在背后驱动的。

标签: 计算机基础, 操作系统, Linux

添加新评论