目前我正在学习linux启动过程。在这里我注意到initrd将创建临时根文件系统,其中包括内核所需的驱动程序(LVM、NFS等)。之后内核将使用该驱动程序并挂载真正的根文件系统。
这里我的问题是为什么内核本身不应该包含必要的驱动程序以及为什么它依赖于 initrd ?
答案1
另请参阅这些问题的答案:
1. 为什么内核本身不应该包含必要的驱动程序
首先,要知道内核内存不是按需分页的。这将是一个循环依赖。如果在内存不足时将磁盘驱动程序调出到磁盘,则以后无法将其加载回来。
(并且在Linux内核内部,我们不会尝试定义一些不涉及存储路径并且可以安全地调出的更高层。据称这是可能的:Windows做到了。我不知道这个更高层是什么也许它是动态定义的,或者也许 Windows 不支持像交换 NFS 这样的奇怪想法。
相反,我们支持加载模块。如果我们在这台特定计算机上不需要 NFS,则不必加载它。
在现代发行版中,这总共节省了大约一百兆字节的 RAM。 (查看 所占用的空间/lib/modules/$VERSION/
。请注意,在现代发行版中,模块被压缩,例如.xz
文件)。
2.以及为什么它依赖于initrd
虽然内核模块是 initrd 更明显的原因,但还有第二个方面。
它允许用户空间构建任意复杂的存储堆栈来访问根文件系统。例如,使用 DHCP 获取 IP 地址,以支持 NFS,或提示输入磁盘加密密码。
同样,内核会尽量避免过度膨胀,例如用户界面代码。
内存使用只是原因之一。内核/用户空间划分有多种用途。例如,内核可以是一个项目,专门处理内核事务。用户空间可以是任何东西;它可以是一个“正常”的 Linux 发行版,也可以是一个完全独立的项目,如 Android 操作系统。
这与其他操作系统不同,例如 BSD 将内核 + 核心用户空间一起维护。 BSD 能够说明这一点通过内核和用户空间的单一标志日转换来处理 2038 问题。
答案2
如果您想将驱动程序嵌入到内核中,则不需要。一个很棒的基于源代码的 Linux 发行版可以帮助使用自定义内核配置,Gentoo
或者您可以简单地使用当前的发行版包管理器来获取 Linux 内核源代码(通常是开发和头文件包)并使用它make config
来逐步完成所需的硬件目标系统所需的值并将每个值从 更改M
为*
。
更详细的说明可以在文档