在内核内部编译内核模块的好处?


Answers:


7

这取决于。如果您的内存量很少,则模块的使用可能会改善简历,因为它们不会每次都重新加载(我发现这对2 GiB的RAM很重要,而对传统硬盘驱动器的4 GiB却不重要)。当由于电池模块中的某些错误(无论是作为内置模块还是作为模块)而花费很长时间(几分钟)启动时,尤其如此。即使没有gentoo上的错误,我也systemd-analysis仅通过从静态编译的内核更改为模块就设法将时间(由报道)从33s 缩短到18s-“令人惊讶的是”内核的开始从9s更改为1.5s。

另外,当您不知道要使用什么硬件时,模块显然是有益的。

PS。您甚至可以将重要的驱动程序编译为模块,只要将它们包括在initrd中即可。例如,发行版将在安装时的initrd中包含/的文件系统,硬盘驱动器的驱动程序等。


您介意再次仔细阅读此答案吗?我本来可以,但我不知道您打算说些什么,例如...在传统硬盘上
tshepang 2011年

我的意思是磁性的(我对SSD没有任何经验)。
Maciej Piechotka,2011年

我试图使它更具可读性。你能检查一下我是否搞砸了。
tshepang 2011年

谢谢。我刚完成考试,所以没有时间去看。
Maciej Piechotka

7

据我所知,没有速度差异。

我认为,由于分配的粒度为一页,因此您将获得几kB的内核内存,因此在典型的体系结构上,每个模块平均浪费约2kB(1/2页)的内存。即使在嵌入式系统上,这也并不重要。您还可以获得一点磁盘空间,因为可以像内核一样压缩模块。在存储量很少的嵌入式系统中,这可能更为相关。

如果可以完全省去模块,那么可以节省一点内核内存(不需要模块加载器),磁盘空间(不需要模块实用程序)和系统复杂性(不需要在发行版中包含模块加载功能) )。这些点在某些硬件无法扩展的嵌入式设计中非常有吸引力。


访问模块中的符号要慢一点(涉及到间接访问)。但是增加的灵活性(可以根据需要加载/卸载,不必为使用中的确切硬件构建手工定制的内核,...)是值得的(除非您要针对非常严格的环境进行构建,永远不会改变)。
vonbrand

4

有几个潜在的好处。性能是有争议的。您可以避免与动态加载程序相关的一些运行时开销,但是除非您依赖实时调度程序,否则我怀疑这是一个大问题。

如果您要利用系统上的大页面,则可能创建更大的静态内核映像意味着您可以更有效地利用页面描述符缓存。某些系统会“限制”内核,以便将内核紧密封装在一个内存区域中,这可以减轻由于较小(甚至可能是较大的)页面错误而引起的某些延迟。

从体系结构上讲,它可能适合您提供一个大形象,认为较少的独立模块更易于维护,而灵活性的丧失并不重要。许多这种推理都涉及样式和实践问题。


2

有时这是必要的。如果将一些重要的驱动程序(例如SCSI驱动程序)编译为模块,则系统将无法启动。

作为模块编译的另一个不错的选择是根分区的文件系统类型。如果内核不懂ext3阅读/lib/modules/,它将如何从中加载模块?

可以这样考虑:使用内核模块需要对系统有足够的了解才能读取和加载内核模块。用那个和试错:-)


我在考虑一些性能改进?有没有?
phunehehe

1
过去,人们竭尽全力生产出仅需所需的最小内核。今天,这已经发生了很大变化。实际上,每当您第一次加载模块时,性能都会受到影响。这并不是说你应该编译内核的一切:-)看到这个:articleinput.com/e/a/title/...
nc3b

对于非重要的驱动程序或功能有什么好处?例如,如果我只想使用终端和一堆网络实用程序而无需其他需求或功能。如果我只在内核中编译所有需要的模块和驱动程序而没有可加载的模块,会有什么好处?
uray 2010年

3
公牛。系统将使用SCSI驱动程序作为initrd中的模块正常启动。那就是他们的目的。
wzzrd 2010年

是的...只要模块处于内核可以理解的initrd中...
Dagelf

2

我为内核中的内置硬件静态编译了每个驱动程序。异常的硬件不是永久性的(例如,usb连接的硬件)。

由于我的硬件配置不太可能很快改变,因此我不必理会模块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.