开机到内核执行,Linux 背后都经历了什么?
你有没有过这样的经历?
在你按下电脑的电源按钮后,屏幕上的加载动画开始循环,无数次之后,终于呈现了熟悉的桌面。
对于大多数人来说,这只是一个普通的开机过程,而对于一些技术迷来说,这背后隐藏着一个精彩的故事。
今天,我们来聊聊这个过程,从你按下开机按钮那一刻,到 Linux 内核开始执行的那一刻,这背后究竟发生了什么。
从电源键到 Boot Loader 的第一步也许你早就发现了,按下电源按钮之后,并不是立马到系统桌面。
事实上,这个过程有很多步骤。
首先最重要的就是主板上的固件,称作UEFI(统一可扩展固件接口),它立刻开始执行。
UEFI 可以理解为一座桥梁,连接了硬件与操作系统。
它会先去检查和初始化你的硬件,包括CPU、内存、显卡等等,确保每个部件都可以正常工作。
接下来,UEFI 会运行一个叫做 Boot Manager 的组件。
Boot Manager 的工作是找到并启动一个 UEFI 应用程序,常见的 UEFI 应用程序就是我们的 Boot Loader。
你可能熟悉的 GRUB 或者 Systemd-boot,其实都是 UEFI 应用程序。
这时候,Boot Manager 会查找一个叫 BootOrder 的变量,这个变量里记录了一系列可以启动的程序。
它会按顺序尝试,直到找到一个可以运行的。
解密 Boot Loader 的工作原理这时候,主角之一的 Boot Loader 上场了。
假设我们用的是 Systemd-boot。
它的主要任务是加载并启动 Linux 内核。
Systemd-boot 会先从一个特定目录下读取配置文件,这些配置文件描述了不同的启动项,比如你可能装了多个系统或者多个内核版本。
Systemd-boot 还会有一个默认启动项,通常是最近的一次选择。
你可能会好奇,这里提到的配置文件是干什么的?
实际情况是,里面记录了内核的位置、要加载的初始文件系统(Initrd),以及一些内核参数。
可以把这些配置文件看做是指路牌,告诉系统如何开始自己的旅程。
还没完,Systemd-boot 接下来会展示一个简洁的菜单,让你可以选择不同启动项。
我们可能经常忽略它直接跳过,但它确实存在,尤其对于一些需要特定启动选项的场景来说非常有用。
从 Boot Loader 到 Linux 内核一旦选好了启动项,真正的魔法才开始。
Systemd-boot 会加载指定的内核到内存中,并同时加载 initrd 文件。
这个 initrd 就好比是一个小型的根文件系统,为内核启动初期提供必要的资源支持。
Systemd-boot 综合 UEFI 提供的服务,如 LoadImage 和 StartImage,完成了加载和启动工作。
这个时候,控制权真正交到了 Linux 内核手里。
内核首先解压 initrd 到内存,并启动里面第一个用户程序,这个程序会挂载实际的根文件系统并让位给真正的 init 程序。
这个 init 文件就是我们平常说的操作系统的第一进程。
从这里开始,内核根据配置和硬件实际情况开始初始化各种子系统,最终启动用户空间的应用,你看到熟悉的登录界面或者桌面,也就意味着 Linux 内核已经完成了它的启动过程。
这么看下来,从你按下开机按钮的那一秒开始,开机过程中所发生的一切其实并不像我们想象的那样简单。
背后有硬件初始化、固件管理、引导加载程序和内核启动的层层递进。
每一步都至关重要,环环相扣。
日常使用中,我们无需关注这些复杂的细节,但偶尔了解一下还是相当有趣的。
它不仅让我们更清楚地认识到计算机如何为我们服务,也让我们更加能够理解这些技术背后的逻辑。
或许下次,当你再按下电源按钮时,会有一丝敬意打心底蹦出来,为那些默默工作的技术奇迹点个赞。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。