其实并不一定需要。
如果是Red Hat系的操作系统,在编译对应内核版本的模块的时候,只需要安装对应版本的 kernel 二进制包 + kernel-devel 开发包即可,这个开发包里面的内容不是源代码,而是符号表,Makefile嵌套规则,以及一些没有放到 kernel-headers 的头文件。换句话说,如果你有kernel二进制包+模块ko+符号表+Make规则,你接下去只需要一份内核模块和一个简单的Makefile就可以编译了。
当然,如果没有kernel二进制包也没有开发包,那就只有去找内核源码了。
打个比方,做嵌入式开发时,你本机的内核和目标机上是不同的,怎么在本机上编出能在目标机上可以工作的kernel module呢?
除了需要和目标机架构对应的编译工具链,你还需要一份和目标机内核版本对应的kernel source,这个kernel source的获得方法就是安装一个目标机内核对应版本的kernel-devel SRPM(source RPM),并将编译时make -C选项的参数指定到目标机版本的kernel source目录。
补充一下:
内核是时时刻刻都在发生变化的,一个kernel module必然会使用内核以及其他模块export出来的函数,怎么保证这些接口能跟它的kernel module对应,kernel的做法是给每个release的内核版本都打一个tag,这个值可以从uname -r的输出种查看到。
用modinfo命令去查看一个kernel module的属性时,vergemic字段保存的签名要和目标机上uname -r的输出一致,kernel module才可能插的上。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。