Linux 内核模块是一种 Linux 系统分页池吗?

Gab*_*tti 5 swap kernel-modules virtual-memory linux-kernel

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

Gil*_*il' 11

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

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

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

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

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


HEK*_*KTO 5

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

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

有关内核模块的更多信息,请阅读此处