开发者社区> 问答> 正文

为什么编译内核模块需要内核的source code?

为什么编译内核模块需要内核的source code?

展开
收起
我的中国 2017-11-30 18:57:34 2877 0
2 条回答
写回答
取消 提交回答
  • Linux Kernel Developer @ 阿里巴巴操作系统团队

    其实并不一定需要。

    如果是Red Hat系的操作系统,在编译对应内核版本的模块的时候,只需要安装对应版本的 kernel 二进制包 + kernel-devel 开发包即可,这个开发包里面的内容不是源代码,而是符号表,Makefile嵌套规则,以及一些没有放到 kernel-headers 的头文件。换句话说,如果你有kernel二进制包+模块ko+符号表+Make规则,你接下去只需要一份内核模块和一个简单的Makefile就可以编译了。

    当然,如果没有kernel二进制包也没有开发包,那就只有去找内核源码了。

    2019-07-17 21:46:47
    赞同 展开评论 打赏
  • R&S网络资深工程师 ,阿里云论坛官方版主,阿里云云计算ACP,春考教学网站长,IT技术晋级之路专辑作者

    打个比方,做嵌入式开发时,你本机的内核和目标机上是不同的,怎么在本机上编出能在目标机上可以工作的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才可能插的上。

    2019-07-17 21:46:47
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载