Linux内核模块相关的理解?

时间:2015-09-22 11:57:57

标签: linux linux-kernel

要加载模块,内核必须包含模块中使用的所有内核符号。如果这些符号在编译时未包含在内核中,则由于缺少依赖性,模块将不会被加载。

这个平均内核模块是应该用完整的内核编译编译来包含vmlinux中的内核模块符号,如果我们单独编译模块那么我们将无法在运行时加载内核?

请纠正我的理解,即使我提出错误的问题,请更正。

1 个答案:

答案 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函数。因此,您需要在编译内核时做出合理的决定,以包含可以加载所有可能加载的模块的基本要素。