打开计算机时究竟会发生什么?

当你按下电源按钮启动计算机时,实际上触发了一系列复杂的步骤,这个过程通常被称为“启动”,源于“引导程序”的概念。不论你使用的是Windows电脑、Mac还是Linux系统,幕后发生的事情大体相似。

硬件启动流程

当按下电源按钮的瞬间,计算机的各个组件开始通电,包括主板、中央处理器(CPU)、硬盘驱动器(HDD)、固态硬盘(SSD)、图形处理器(GPU)以及其他所有硬件。

负责供电的硬件通常被称为“电源”。在典型的台式电脑中,电源通常位于机箱的一个角落(上图中黄色部分),也是连接交流电源线的地方。

CPU 加载 UEFI 或 BIOS

一旦有了电力供应,CPU会开始自我初始化,并寻找一个存储在主板芯片上的小型程序。

过去,个人电脑(PC)会加载一个名为BIOS(基本输入/输出系统)的程序。但在现代PC上,CPU会加载UEFI(统一可扩展固件接口)。UEFI是旧式BIOS的升级替代品。然而,为了避免混淆,一些PC制造商仍然将他们的UEFI软件称为“BIOS”。

UEFI 或 BIOS 的硬件测试与初始化

BIOS或UEFI固件从主板上的一个特殊区域加载配置设置,传统上,这些设置保存在由CMOS电池供电的内存中。如果你在BIOS或UEFI设置界面修改了一些底层设置,这些自定义设置就会存储在这里。

CPU运行UEFI或BIOS,它们会测试和初始化系统的硬件,包括CPU本身。例如,如果你的计算机没有安装任何内存(RAM),它可能会发出蜂鸣声并显示错误,从而停止启动过程。这个过程被称为POST(开机自检)。

在此期间,你可能会在屏幕上看到电脑制造商的标志,通常可以通过按一个键进入BIOS或UEFI设置界面。但是,许多现代PC快速完成这个过程,以至于它们可能不会显示标志,而需要从Windows启动选项菜单进入UEFI设置。

UEFI的功能不仅仅是初始化硬件,它实际上可以被看作是一个微型操作系统。例如,英特尔的CPU包含英特尔管理引擎,该引擎提供了多种功能,包括支持英特尔的主动管理技术,该技术允许远程管理商用电脑。

UEFI 或 BIOS 切换到启动设备

完成硬件的测试和初始化后,UEFI或BIOS会把启动PC的责任移交给操作系统的引导加载程序。

UEFI或BIOS会寻找“启动设备”来启动你的操作系统。通常,这会是你的硬盘或固态硬盘,但也可能是光盘(CD、DVD)、U盘或网络位置。 启动设备可以在UEFI或BIOS设置界面中配置。如果有多个启动设备,UEFI或BIOS会按照它们列出的顺序尝试启动。例如,如果你的光驱中有一张可启动的DVD,系统可能会先尝试从DVD启动,然后再尝试从硬盘启动。

传统上,BIOS会查看MBR(主引导记录),它是磁盘开头的一个特殊启动扇区。MBR包含了加载操作系统其余部分的代码,通常被称为“引导加载程序”。 BIOS执行引导加载程序,然后引导加载程序进一步加载并启动实际的操作系统,比如Windows或Linux。

采用UEFI的计算机仍然可以使用这种老式的MBR启动方法来启动操作系统,但它们通常会使用一个名为EFI可执行文件的东西来替代。这些文件不必存储在磁盘的开头,而是存储在名为“EFI系统分区”的地方。

不管哪种方式,原理都是相似的:BIOS或UEFI会检查系统上的存储设备,在MBR或EFI系统分区中查找小型程序并执行它。如果没有可启动的设备,启动过程将会失败,你会在屏幕上看到一条错误信息。

在现代PC上,UEFI固件通常被配置为“安全启动”。这确保了它所启动的操作系统没有被篡改,也不会加载低级别的恶意软件。如果启用了安全启动,UEFI会在启动之前检查引导加载程序是否正确签名。

引导加载程序加载完整的操作系统

引导加载程序是一个小型程序,它的主要任务是启动操作系统的其余部分。Windows使用名为Windows Boot Manager (Bootmgr.exe) 的引导加载程序,大多数Linux系统使用GRUB,而Mac则使用名为boot.efi的程序。

如果引导加载程序出现问题(比如,如果它的文件在磁盘上损坏),你会看到引导加载程序的错误信息,并且启动过程会停止。

引导加载程序本身只是一个小型程序,它不会独自完成启动过程。在Windows上,Windows启动管理器会寻找并启动Windows 操作系统加载程序。操作系统加载程序会加载运行内核(Windows操作系统的核心部分)所需的基本硬件驱动程序,然后启动内核。接着,内核会将系统注册表加载到内存中,并加载任何标记为“BOOT_START”的附加硬件驱动程序,这意味着它们应该在启动时加载。然后,Windows内核会启动会话管理器进程(Smss.exe),该进程会启动系统会话并加载其他驱动程序。这个过程会持续进行,Windows会加载后台服务以及允许你登录的欢迎界面。

在Linux上,GRUB引导加载程序会加载Linux内核。内核会启动init系统,在大多数现代Linux发行版中是systemd。 init系统负责启动服务和其他用户进程,直至出现登录提示。

这个复杂的流程仅仅是一种通过正确顺序执行操作来确保所有内容都被正确加载的方法。

顺便一提,所谓的“启动程序”实际上是在你登录用户帐户时加载的,而不是在系统启动时加载的。然而,一些后台服务(在Windows上)或者守护进程(在Linux和macOS上)会在系统启动时在后台启动。

关闭过程同样非常复杂,这就是当你关闭或退出Windows电脑时发生的事情。

图片来源:苏万万洛/Shutterstock.com, DR 图像/Shutterstock.com,