启动时是否将整个内核加载到内存中?

启动时是否将整个内核加载到内存中?

我通读了这个流行的 IBM 文档(我在网上经常看到它)解释了初始 RAM 磁盘的功能。

不过,我在概念化其工作原理时遇到了困难。

在文档中它说

引导加载程序(例如 GRUB)识别要加载的内核并复制该内核内核映像和任何关联的 initrd 到内存中

我已经很困惑了:它将整个内核复制到内存中还是只是其中的一部分?如果整个内核都在内存中,那么为什么我们还需要初始 RAM 磁盘呢?

我认为 initrd 的目的是能够拥有一个小的通用内核映像,并且 initrd 将在加载内核映像之前在其中安装正确的模块。但是如果整个内核已经在内存中,为什么我们还需要 initrd 呢?

这也带来了另一件让我困惑的事情——加载到内核中的模块位于哪里?所有的内核模块都存储在 initrd 中吗?

答案1

整个内核在启动时加载到内存中,通常与initramfs现在一起加载。 (仍然可以将系统设置为无需启动,initramfs但这在台式机和服务器上并不常见。)

initramfs作用是提供挂载“真实”文件系统并继续引导系统所需的功能。这涉及内核模块,以及各种二进制文件:您至少需要udev,也许一些网络,以及kmod加载模块。

模块可以在启动之后加载到内核中,因此initramfs.它们可以存储在任何地方:initramfs/lib/modules真实的文件系统上,在开发树中(如果您正在开发模块)...只需initramfs包含挂载根文件系统(包含其余部分)所需的模块。

答案2

整个内核(但不是其模块)将被加载到内存中。如果在任何文件系统可用之前内核需要某些模块(这通常意味着文件系统及其设备的驱动程序),那么这些模块将位于 initramfs (内存中)中,内核将从那里加载它们。其他模块可以稍后从文件系统加载。

答案3

大多数现代 Linux 设置中的内核很大程度上是基于模块的,即内核本身(在启动时加载到 RAM 中)仅包含最基本的功能,其余所有功能都编译为模块(可在运行时加载)。为了使其工作,即使启动所需的设备或文件系统是模块,也会initramfs加载内核(顾名思义,这是一个带有简单文件系统的 RAM 区域,在启动时安装)。该临时文件系统安装在 上/,包含启动程序和所需的模块。一旦启动initramfs完成,Linux 就会执行 a pivot_root(8),安装真实的文件/并删除initramfs内容。

这种复杂性的关键在于,例如,发行版可以编译内核(最小内核和全套模块),并在安装内核时创建initramfs适合目标机器的硬件和设置的内核。由于“个人计算机”的设备和配置多种多样,因此需要所有这些。

相关内容