通常内核源代码存储在
/usr/src/linux-2.6.x/
中。
为了避免在修改模块的源代码时重新编译整个内核,如何重新编译该模块?
切换到源代码树的根目录并运行以下命令:
$ make modules SUBDIRS=drivers/the_module_directory
并安装已编译的模块:
$ make modules_install SUBDIRS=drivers/the_module_directory
注意: 正如 lunakid 提到的,后一个命令可能不先构建模块,所以要小心。
从内核版本3.x.x和4.x.x开始,过程变得更加复杂(但有希望,所以继续阅读):
make distclean
如果您不仅克隆了新源而且之前还用于构建其他模块/boot/config-`uname -r`
文件(例如:/boot/config-4.8.0-46-generic)复制到内核源文件夹文件.config并运行make oldconfig
。如果该模块属于内核源代码,请通过调用 make menuconfig
、搜索该模块并在必要时应用字母“M”来验证它是否已启用make kernelversion
完全匹配,您可以使用 uname -r
进行验证)make scripts
make prepare
和 make modules_prepare
必须在实际模块构建之前执行/usr/src/linux-headers-`uname -r`/Module.symvers
(示例:/usr/src/linux-headers-3.13.0-117-generic/Module.symvers)的目标系统标头文件夹复制到为模块编译准备的新创建的模块源文件文件夹(示例中的extra)。obj-y += <module_source_file_name>.o
或者如果源代码很复杂,请使用此处make -C <kernel source path> M=the_module_directory
构建模块的正确时机(示例:make -C . M=extra/
)modprobe --dump-modversion <module_name>.ko
验证模块导出API与Module.symvers中相应值之间的CRC匹配。如果失败,请使用命令 modinfo <module_name>.ko
代替解决方案如下:
提交所有更改,使用
git tag -a <tag version> -f
命令强制释放标签移动到您的修改之上。然后从第 8 步开始重建模块
您可以将模块名称或模块目录的路径作为参数传递给make。
make path/to/the/module/itself.ko
make path/to/the/module/directory/
如果您只编辑 drivers/net/ethernet/intel/e1000/e1000_main.c 文件中的代码
构建模块。
make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000
安装模块。
cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module
我无法发表评论。因此,要完成 Niklas B. 对于
kernel-5.15
系列 的回答
切换到源代码树的根目录并运行以下命令。
make prepare
make modules SUBDIRS=drivers/the_module_directory
make modules_install SUBDIRS=drivers/the_module_directory
modules_install
重新安装所有驱动程序。我不知道是否可以/建议复制您的驱动程序。
使用
rtl8xxxu
驱动程序进行测试。