Open urain39 opened 1 year ago
TL;DR:
1. 检查 include/linux/vermagic.h 并修改 defconfig 2. make xxx_defconfig 3. make prepare 4. make scripts 5. 修改 include/config/kernel.release 6. 修改 include/generated/utsrelease.h 7. 进入内核模块目录并编译内核(make -C KERNDIR M=MODDIR modules)
有时我们可能会遇到这样一种情况,内核并没有开源,但支持加载内核模块。想在这样的内核上做扩展,一般得靠内核模块来实现。
可问题是,内核模块只能在对应版本号的内核上使用。一般编译时生成的版本号都是带有随机后缀的,即使是使用相同版本的内核,编译的内核模块一般情况下也是无法直接使用的。
我在网上搜索了好几篇关于内核模块和内核版本的的文章后,终于找到了include/linux/vermagic.h、include/config/kernel.release和include/generated/utsrelease.h这三个相关的文件。
include/linux/vermagic.h
include/config/kernel.release
include/generated/utsrelease.h
其中include/linux/vermagic.h定义的是内核模块中校验的版本魔数(vermagic),而下面两个则是定义内核版本号。一般情况下,我们只需要改下面两个文件,或者说只修改最后一个文件就行。
但如果你的内核配置不太一样,那么你可能需要根据你实际的目标内核版本和include/linux/vermagic.h中的规则,修改xxx_defconfig。这些信息可以使用16进制编辑器在原有的内核模块中搜索关键词vermagic找到。
xxx_defconfig
vermagic
当修改完成后,那么你就可以直接编译内核模块了。
TL;DR:
有时我们可能会遇到这样一种情况,内核并没有开源,但支持加载内核模块。想在这样的内核上做扩展,一般得靠内核模块来实现。
可问题是,内核模块只能在对应版本号的内核上使用。一般编译时生成的版本号都是带有随机后缀的,即使是使用相同版本的内核,编译的内核模块一般情况下也是无法直接使用的。
我在网上搜索了好几篇关于内核模块和内核版本的的文章后,终于找到了
include/linux/vermagic.h
、include/config/kernel.release
和include/generated/utsrelease.h
这三个相关的文件。其中
include/linux/vermagic.h
定义的是内核模块中校验的版本魔数(vermagic),而下面两个则是定义内核版本号。一般情况下,我们只需要改下面两个文件,或者说只修改最后一个文件就行。但如果你的内核配置不太一样,那么你可能需要根据你实际的目标内核版本和
include/linux/vermagic.h
中的规则,修改xxx_defconfig
。这些信息可以使用16进制编辑器在原有的内核模块中搜索关键词vermagic
找到。当修改完成后,那么你就可以直接编译内核模块了。