没有运行程序的电脑只是一堆惰性的电子元件。电脑开机后要做的第一件事是启动一个名为操作系统的特殊程序。操作系统的工作是通过处理控制电脑硬件的繁琐细节来帮助其他计算机程序工作。
启动操作系统的过程称为 启动 (最初是 引导,并暗示了 “通过自己的鞋带把自己拉起来” 的过程)。你的电脑知道如何启动,因为启动指令内置于其芯片之一,BIOS(或基本输入/输出系统)芯片中。
BIOS 芯片告诉它在一个固定的位置查找,通常在编号最小的硬盘(启动盘)上查找一个名为 启动加载器 的特殊程序(在 Linux 下,启动加载器称为 Grub 或 LILO)。启动加载器被拉入内存并启动。启动加载器的工作是启动真正的操作系统。
加载器通过查找 内核 来完成此操作,将其加载到内存中并启动它。如果你使用 Linux 并在屏幕上看到 “LILO” 以及一堆点,则表示它正在加载内核。(每个点表示它已加载了另一个 内核代码磁盘块。)
(你可能想知道为什么 BIOS 不直接加载内核 — 为什么使用启动加载器的两步过程?好吧,BIOS 不是非常智能。事实上,它非常“笨”,并且 Linux 在启动后根本不使用它。它最初是为带有微型磁盘的原始 8 位 PC 编写的,并且实际上无法访问足够的磁盘来直接加载内核。启动加载器步骤还允许你从磁盘上不同的位置启动多个操作系统之一,以防万一 Unix 对你来说不够好。)
内核启动后,它必须环顾四周,找到其余硬件,并准备运行程序。它通过 “探测” 而不是普通的内存位置,而是 I/O 端口 — 特殊的总线地址,设备控制器卡很可能在那里侦听命令。内核不会随机探测;它有很多关于可能在何处找到什么以及控制器在存在时将如何响应的内置知识。此过程称为 自动探测。
你可能能够或可能无法看到任何正在发生的事情。在 Unix 系统使用文本控制台的时候,你会看到启动消息在系统启动时在屏幕上滚动。现在,Unix 系统通常将启动消息隐藏在图形启动画面之后。你可能可以通过使用组合键 Ctrl-Shift-F1 切换到文本控制台视图来看到它们。如果这有效,你应该能够使用不同的 Ctrl-Shift 序列切换回图形启动画面;尝试 F7、F8 和 F9。
大多数在启动时发出的消息都是内核通过 I/O 端口自动探测你的硬件,弄清楚它可以使用的东西并使自身适应你的机器。Linux 内核在这方面非常出色,比大多数其他 Unix 系统都好,并且比 DOS 或 Windows 好得多。事实上,许多 Linux 老手认为 Linux 启动时探测的巧妙性(这使得安装相对容易)是其从免费 Unix 实验中脱颖而出,吸引大量用户的关键原因。
但是,完全加载并运行内核并不是启动过程的结束;这只是第一阶段(有时称为 运行级别 1)。在第一阶段之后,内核将控制权交给一个名为 ‘init’ 的特殊进程,该进程会派生出几个内务处理进程。(最近的一些 Linux 系统使用另一个名为 ‘upstart’ 的程序,它执行类似的操作)
init 进程的首要任务通常是检查以确保你的磁盘正常。磁盘文件系统是脆弱的东西;如果它们因硬件故障或突然断电而损坏,那么在你的 Unix 完全启动之前,有充分的理由采取恢复步骤。当我们稍后讨论 文件系统可能出错的方式 时,我们将详细介绍其中的一些内容。
Init 的下一步是启动几个 守护进程。守护进程是一个程序,例如打印后台处理程序、邮件侦听器或 WWW 服务器,它们潜伏在后台,等待事情发生。这些特殊程序通常必须协调可能冲突的多个请求。它们之所以是守护进程,是因为编写一个持续运行并了解所有请求的程序通常比尝试确保一群副本(每个副本处理一个请求并且都同时运行)不会互相干扰更容易。你的系统启动的特定守护进程集合可能会有所不同,但几乎总是包括打印后台处理程序(打印机的看门人守护进程)。
下一步是为用户做准备。Init 启动一个名为 getty 的程序副本来监视你的屏幕和键盘(也可能启动更多副本来监视拨入串行端口)。实际上,现在它通常启动多个 getty 副本,以便你有几个(通常是 7 或 8 个)虚拟控制台,你的屏幕和键盘一次连接到一个控制台。但是你可能看不到任何这些,因为你的一个控制台将被 X 服务器接管(稍后会详细介绍)。
我们还没有完成。下一步是启动支持网络和其他服务的各种守护进程。其中最重要的是你的 X 服务器。X 是一个管理你的显示器、键盘和鼠标的守护进程。它的主要工作是生成你通常在屏幕上看到的彩色像素图形。
当 X 服务器启动时,在你机器启动过程的最后一部分,它有效地从先前控制的任何虚拟控制台接管硬件。那时你将看到一个图形登录屏幕,它由一个名为 显示管理器 的程序为你生成。