要加载模块,内核必须包含模块中使用的所有内核符号。如果这些符号在编译时未包含在内核中,则由于缺少依赖性,模块将不会被加载。
这个平均内核模块是应该用完整的内核编译编译来包含vmlinux中的内核模块符号,如果我们单独编译模块那么我们将无法在运行时加载内核?
请纠正我的理解,即使我提出错误的问题,请更正。
答案 0 :(得分:2)
如果我没弄错的话,你指的是这篇文章:http://www.linuxjournal.com/content/kbuild-linux-kernel-build-system?page=0,0
这个平均内核模块是应该用完整的内核编译编译来包含vmlinux中的内核模块符号,如果我们单独编译模块那么我们将无法在运行时加载内核?
此声明涉及内核编译,而不是模块编译(而是加载)。
要加载模块,内核必须包含模块中使用的所有内核符号。如果这些符号在编译时未包含在内核中,则由于缺少依赖性,将不会加载该模块。
这不完全正确。以下是The Linux Kernel Module Programming Guide
中的示例例如,msdos.ko要求fat.ko模块已经加载到内核中。如果另一个模块定义了所请求模块使用的符号(变量或函数),则请求的模块依赖于另一个模块。
所以,你仍然可以加载模块,即使符号没有用内核编译(但是由不同的模块提供)
但是,想象一下,在没有printk
支持的情况下编译内核。现在,您尝试加载的每个模块都会尝试查找根本不存在的printk
函数。因此,您需要在编译内核时做出合理的决定,以包含可以加载所有可能加载的模块的基本要素。