如何重新编译单个内核模块?

use*_*635 48 linux makefile gnu-make kernel-module linux-kernel

通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?

Nik*_* B. 56

切换到源树的根目录并运行以下命令:

$ make modules SUBDIRS=drivers/the_module_directory
Run Code Online (Sandbox Code Playgroud)

并安装已编译的模块:

$ make modules_install SUBDIRS=drivers/the_module_directory
Run Code Online (Sandbox Code Playgroud)

注意:正如lunakid所提到的,后一个命令可能不会先构建模块,所以要小心.


Ole*_*rin 13

因为内核版本3.xx4.xx程序变得更复杂(但是有希望,所以请继续阅读):

  1. make distclean 如果您还没有克隆新的源,但之前用于构建其他模块
  2. 为模块源创建新文件夹(例如:extra)并仅复制与需要构建到此新文件夹中的模块相关的源文件(来自内核源或其他地方)
  3. /boot/config-`uname -r`文件(例如:/boot/config-4.8.0-46-generic)复制到内核​​源文件夹文件.config并运行make oldconfig.如果模块属于内核源,请通过调用验证是否已启用make menuconfig,通过搜索模块并在必要时应用字母"M"
  4. 内核源根目录Makefile必须使用与当前运行的版本组件匹配的精确版本组件进行更改(您可以验证make kernelversion它是否与其完全匹配uname -r)
  5. 之前有一个强烈建议构建脚本 make scripts
  6. make prepare并且make modules_prepare必须在实际模块构建之前执行
  7. Module.symvers必须从目标系统头文件夹中复制相应的运行内核版本/usr/src/linux-headers-`uname -r`/Module.symvers(例如:/usr/src/linux-headers-3.13.0-117-generic/Module.symvers)到新创建的模块源文件夹中为模块汇编(一个额外的例子中).
  8. 在模块源编译文件夹中创建具有以下行的新Makefile:obj-y += <module_source_file_name>.o或者如果源代码很复杂,请使用此处的指导
  9. 只有它的建立模块合适的时间make -C <kernel source path> M=the_module_directory(例如:make -C . M=extra/)
  10. 使用命令modprobe --dump-modversion <module_name>.ko验证模块导出API与Module.symvers中相应值之间的CRC匹配.在失败使用命令的情况下modinfo <module_name>.ko,而不是
  11. 验证kernel.release文件内容是否与当前运行版本的标头中的内容完全匹配.如果你发现最后添加了+,那就意味着你一直在编译git clonned source,你的实验修改导致构建系统通过在结尾添加+来破坏localversion字符串.
  12. 如果在kernel.release存储的值的尾部发现了+,那么它与目标运行内核的确切名称不匹配,

解决方案如下:

提交所有更改,强制释放标记使用git tag -a <tag version> -f命令转移到修改之上.然后从步骤8重建您的模块


小智 8

如果您仅编辑 drivers/net/ethernet/intel/e1000/e1000_main.c 文件中的代码

构建模块。

make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000
Run Code Online (Sandbox Code Playgroud)

安装模块。

cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
Run Code Online (Sandbox Code Playgroud)


Szi*_*fer 7

您可以将路径传递给模块名称或模块目录以作为参数.

make path/to/the/module/itself.ko
make path/to/the/module/directory/
Run Code Online (Sandbox Code Playgroud)