PID 1 中的飞溅

The*_*use 3 startup process ubuntu init

我刚刚开始学习 Linux 中的进程。

\n

我遇到了这个名为\n的命令ps -ef(它将显示所有正在运行的进程)。

\n

我得到这样的输出

\n
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD\nroot         1     0     1  0    1 Apr17 ?        00:00:18 /sbin/init splash\n
Run Code Online (Sandbox Code Playgroud)\n

这里splash代表什么?\xc2\xa0\n我知道init是我们启动计算机时运行的第一个进程。\xc2\xa0\n但是什么是splash?\xe2\x80\x82它有什么作用呢?

\n

另外,谁能告诉我为什么init称为第一个运行的进程,\n但是当我们启动计算机时首先运行的是BIOS或UEFI程序。\n那么为什么我们将init称为第一个进程,而不是BIOS或UEFI程序UEFI?

\n

the*_*rpy 7

这里的splash代表什么?我知道init是我们启动计算机时运行的第一个进程。但什么是飞溅呢?它有什么作用 ?

首先,您正在运行使用 的 ubuntu systemd,它允许您在启动过程中显示启动屏幕,这就是它具有splash 参数的原因。请参阅splash.c源代码。

[编辑]你的计算机正在运行systemd,因为据我所知,systemd是唯一支持splash参数的init - 可能还有其他参数,但由于它也是Ubuntu上的默认设置,我认为这是一个安全的猜测。在 Ubuntu 上,默认情况下,/sbin/init是一个到 的符号链接/usr/lib/systemd/systemd,即加载的内核/sbin/init splashps这里使用进程的命令行,这将是/sbin/init splash,这就是您所看到的。

也有人可以告诉我 init 被称为第一个要运行的进程,但它是我们启动计算机时首先运行的 BIOS 或 UFEI 程序。那么为什么我们将 init 称为第一个进程而不是 BIOS 或 UFEI 呢?

好吧,为了简单起见,BIOS/UEFI 是在启动时加载的程序,它们包含用于进一步启动系统的配置数据。它们最终将找到下一个要启动的程序,例如启动管理器(例如grub),它又将允许您启动内核。我在这里尽量保持简单,但你可以阅读一下。在linux和unix系统上,init是内核生成的第一个程序,因此获得PID 1。

你可以在这里阅读更多内容,实际上,那篇文章已经很老了。我并不声称以下内容 100% 准确。

要引导 x86 计算机,您要做的第一件事就是按下电源按钮。您的电源为主板供电,并等待来自 SMPS(开关模式电源)的信号,以提供足够的电力。例如,它会检查您的 PCIe 显卡是否有足够的电量、CPU 和 RAM 是否存在。

Intel 管理引擎( IME)/ AMD 安全技术从此时开始,IME 是一个独立的 Intel CPU,带有模糊的 minix 3 操作系统,AMD 等效项使用嵌入在中央 CPU 上的 ARM 内核;关于这两个人,我们知之甚少。

一旦主板收到 SMPS,它就会停止不断重置 CPU,CPU 现在读取 ROM 中的地址,这通常是FFFF:0000h;它包含固件代码的跳转(如快捷方式)。

该固件曾经是一个称为 BIOS 的单片代码块,只能与键盘一起使用。有了UEFI,它现在已经成为一个带有迷你文件系统的完整操作系统。今天,跳转点指向一些解压缩 UEFI 的引导代码(可能称为 BIOS)。UEFI 就像迷你操作系统一样,可能具有鼠标支持、网络启动、SCSI、RAID、磁盘和/或内存检查器以及许多其他功能。

UEFI 加载后会执行开机自检 (POST),检查所有硬件是否正常。

完整的 POST 检查许多设备,例如 CMOS、视频 ROM、控制器、DMA(允许设备直接访问 RAM)、CPU、内存和其他设备。当您重置 PC 时,即按下重置按钮或执行重新启动命令时,会执行简单的 POST,而不会注意到 CMOS 是否存在问题等问题。CMOS 是主板上的一个小芯片,包含易失性内存(切断电源,内存就会丢失)和时钟,它由一块小电池供电,包含 UEFI 的所有设置。

UEFI 读取这些设置,对系统进行所需的任何更改,然后继续进一步引导系统。UEFI 可以通过在驱动器上查找引导记录来执行传统引导,也可以使用更现代的 UEFI 引导方法。这需要一个带有 UEFI 引导代码的 FAT32 格式分区,该代码可以加载Linux 内核引导管理器(Windows) 或引导加载程序(例如grub.

UNIX 系统上的内核加载所有需要的设备驱动程序,然后加载 init 进程。Init 可以是systemd或任何其他程序,例如bash;您可以在内核参数中配置它。请注意,如果选择直接使用 UEFI 加载内核,则设置内核参数会困难得多。一旦加载,init 就会获取 PID 1,然后加载用户空间(系统 shell 和可选的图形用户界面)。