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

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

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

 $ make modules SUBDIRS=drivers/the_module_directory 

并安装编译模块:

 $ make modules_install SUBDIRS=drivers/the_module_directory 

注意:正如lunakid提到的那样,后者的命令可能不会先build立模块,所以要小心。

您可以将path传递到模块名称或模块目录作为参数。

 make path/to/the/module/itself.ko make path/to/the/module/directory/ 

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

  1. 如果你不只是克隆一个新的源代码,而是用来构build其他的模块,那么就可以做一些修改
  2. 为模块源创build新的文件夹(例如: extra ),仅将与需要构build的模块相关的源文件(从内核源文件或其他地方)复制到这个新文件夹中
  3. /boot/config-``uname -r文件(例如: /boot/config-4.8.0-46-generic复制到内核​​源文件夹文件.config中,然后运行make oldconfig 。 如果模块属于内核源,则通过调用make menuconfig ,通过search模块并在必要时应用字母“M”来validation它是否已被启用
  4. 内核源代码根Makefile必须用与当前正在运行的组件匹配的确切版本组件进行更改(如果与内核版本完全匹配,则可以使用make kernelversionvalidation)
  5. 在制作脚本之前,也有强烈的build议来构buildmake scripts
  6. make preparemake modules_prepare必须在实际的模块构build之前执行
  7. Module.symvers必须从相应的正在运行的内核版本/usr/src/linux-headers-``uname -r``/Module.symvers的目标系统头文件夹中复制(例如: /usr/src/linux-headers-3.13 .0-117-generic / Module.symvers )添加到为模块编译准备的新创build的模块源文件文件夹(示例中的一个附加文件 )中。
  8. 在模块源代码编译文件夹中创build新的Makefile文件,内容如下: obj-y += <module_source_file_name>.o或者源代码复杂,请使用这里的指导
  9. 只有这样才能正确地build立模块, make -C <kernel source path> M=the_module_directory使用make -C <kernel source path> M=the_module_directory (例如: make -C . M=extra/ make -C <kernel source path> M=the_module_directory make -C . M=extra/
  10. 使用命令modprobe --dump-modversion <module_name>.kovalidation模块导出API与Module.symvers中对应值之间的CRC匹配
  11. validationkernel.release文件内容是否与当前运行版本的标题完全匹配。 如果你在最后发现了+ ,这意味着你一直在编译git clonned source,而你的实验性修改导致了构build系统在最后加上+来折中localversionstring。
  12. 如果在kernel.release存储值的尾部只发现了+ ,并且与目标运行内核的确切名称不匹配,

解决scheme如下:

提交所有更改,强制释放标记,以便使用git tag -a <tag version> -f命令移动到修改的上方。 然后从第8步重build你的模块