LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1903|回复: 4

编译模块为什么要运行对应内核版本?

[复制链接]
发表于 2009-9-25 13:42:36 | 显示全部楼层 |阅读模式
比如我要编译一个2.6.30版本内核中运行的模块,那么为什么一定要先编译一个2.6.30的内核,然后使用这个内核,在运行这个内核的环境里面去编译模块?
我试了在2.6.27环境中使用2.6.30的源代码树去编译模块,出错,但使用2.6.27的源代码树就可以
我以为编译模块的时候只是要去链接内核源代码中的一些头文件和一些函数实现,这与运行的环境应该没什么关联的
编译内核的过程中不也是有make modules,那个时候版本并不对应,却可以通过
那是为什么呢?这两个过程中有什么区别吗?

注:内核源代码树都是编译过的
发表于 2009-9-29 21:41:32 | 显示全部楼层
貌似有个模块的版本检查, 就是那个什么magic什么的。

不懂,瞎说两句!
回复 支持 反对

使用道具 举报

发表于 2009-10-9 19:16:52 | 显示全部楼层
内核模块相当于操作系统的一部分,操作系统加载时校验是比较严格的。

在编译内核模块是,需要链接一个vermagic.o,其中包含目标内核版本信息、编译器版本信息、及一些配置变量的设置。
操作系统在加载内核模块是,这些信息都要被校验,如果不匹配就无法加载。
回复 支持 反对

使用道具 举报

发表于 2009-10-11 13:52:19 | 显示全部楼层
Post by Sorry623;2030155
比如我要编译一个2.6.30版本内核中运行的模块,那么为什么一定要先编译一个2.6.30的内核,然后使用这个内核,在运行这个内核的环境里面去编译模块?
我试了在2.6.27环境中使用2.6.30的源代码树去编译模块,出错,但使用2.6.27的源代码树就可以
我以为编译模块的时候只是要去链接内核源代码中的一些头文件和一些函数实现,这与运行的环境应该没什么关联的
编译内核的过程中不也是有make modules,那个时候版本并不对应,却可以通过
那是为什么呢?这两个过程中有什么区别吗?

注:内核源代码树都是编译过的


内核模块的装载是一个动态链接的过程, 符号表之类在链接有版本号要求, 相近几个版本一般不会有很大问题。 insmod和modprobe对模块的版本检查有区别
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-16 16:48:03 | 显示全部楼层
大体明白了,谢谢楼上各位
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表