Linux 内核模块是一种 Linux 系统页面缓冲池吗?

Linux 内核模块是一种 Linux 系统页面缓冲池吗?

我总是读到 Linux 内核不可分页。
如果我没记错的话,Windows 会将系统虚拟内存分为分页部分(paged pool)和非分页部分(non-paged pool)。
非分页部分直接映射到物理内存并始终保留在那里,因为它负责内核必须完成的最重要的任务,而不太重要的部分可能不会。相反,Linux 内核被划分为可加载模块,但我没有收集到有关这些模块如何实现的信息。
我不明白它们是否已分页,因此您可以暂时将它们传输到磁盘。我通常读到的是,我们可以通过卸载内存来“释放”内存,这对我来说是什么意思仍然很模糊。
当我在这篇文章中写下“分页”或“可分页”时,我隐含的意思是您可以在磁盘上交换这些页面。我解决这个问题是因为通常 Linux 内核被认为是分页的,但它不能被换出

答案1

Linux 内核的任何部分都不能被调出,即使是来自模块的部分。

可以加载内核模块并且可以卸载(如果该模块支持)。这总是发生在用户态进程通过init_moduledelete_module系统调用发出显式请求时(通常通过insmodmodprobe用于加载的实用程序,通过rmmod用于卸载的实用程序)。

一旦模块被加载,它就成为内核的一部分,就像内核的任何其他部分一样。特别是,无法隔离特定模块使用的内存。内核会跟踪内存的哪一部分包含特定模块的代码,但不会跟踪模块可能存储数据的位置。毕竟,模块可以修改任何内核的数据结构。

模块可以向任何内核子系统添加一些代码。大多数模块是硬件驱动程序,但有些不是(例如,它们可以提供安全功能、文件系统、网络功能等)。如果模块使用的数据或代码可以被换出,那么内核的其余部分必须在需要时加载它,这将使系统的设计变得更加复杂。内核还需要确保换出的内存部分不需要将其换回,这很困难。如果交换位于网络文件系统上的交换文件中,并且该模块提供涉及与存储文件的服务器通信的防火墙功能,该怎么办?

完全卸载模块是可能的,因为模块的工作是提供确保模块不需要执行任何操作的代码。内核运行模块的退出函数,并且仅当该函数报告可以安全卸载该模块时才卸载该模块。退出函数必须释放模块“拥有”的任何剩余数据内存(即模块需要的数据,但内核的其他部分不需要),并且必须验证模块中没有注册要在以下情况下调用的代码:有事情发生。没有办法保存模块的数据以进行交换:只有当模块没有剩余数据时才能从 RAM 中删除。

答案2

内存页面交换(您称之为“分页”)和 Linux 内核模块加载/卸载是两个完全不同的功能。

Linux 内核模块可以加载到内核中——之后它就成为内核的一部分。这里的目标是将内核调整为给定的硬件。例如,有数百种类型的网卡,并且有许多支持这些卡的内核模块 - 但在任何特定的机器上,在任何给定时刻,您都只有一种类型的网卡。 Linux 为该卡选择正确的内核模块并加载它,将所有其他模块保留在外部存储器中。

有关内核模块的更多信息,请阅读这里

相关内容