std::john
编译内核后载入modules报version magic错误, 请高手指教
最近把我的SUSE 10内核重新编译了一下, 改了CPU arch参数, 改成我的K7配置并且加了内核CPU抢占, 重新编译了一下,
是按照make bzImage, make modules, make modules_install来的, 然后我手工改了一下grub/menu.1st, 加了一个新启动项, 用我的新编译内核引导系统失败, 载入ide_core, resierfs等一些核心内核module的时候报错: magic version: 2.6.13-15-default 586 REGPARM gcc-4.0 should be 2.6.13-15-default preempt K7 REGPARM gcc-4.0, 然后系统就崩了.
我晕, 然后用老内核文件启动系统, 报的错刚好相反, 都是一些非核心的内核模块, 不过还能启动, 这下over了, 两边不是人啊,
我是不是编译内核的过程有什么错误?难道系统运行时使用的核心模块编译后安装时不能被替换?
我该怎么操作呢? 请高手解答一下:)
下面是升级前内核的部分启动报错信息:
tfs: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ntfs: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
parport: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
lp: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_conntrack: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
ip_tables: version magic '2.6.13-15-default preempt K7 REGPARM gcc-4.0' should be '2.6.13-15-default 586 REGPARM gcc-4.0'
std::john
不好意思发到系统管理了,请斑竹帮忙移到内核讨论区好, 谢谢~
rt
todaygood
出现跟你类似的问题,
看了下面的一段话 :
为内核符号添加校验字符串来验证模块的版本与内核的版本是否匹配是繁杂和浪费内核空间的;而且随着SMP(对称多处理器)、PREEMPT(可抢占内核)等机制在2.6内核的引入和完善,模块运行时对内核的依赖不仅取决于内核版本,还取决于内核的配置,此时内核符号的校验码是否一致不能成为判断模块可否被加载的充分条件。2.6 内核下,在linux/vermagic.h中定义有VERMAGIC_STRING,VERMAGIC_STRING不仅包含内核版本号,还包含有内核使用的gcc版本,SMP与PREEMPT等配置信息。模块在编译时,我们可以看到屏幕上会显示"MODPOST"。在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts/mod/modpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过`modinfo mymodule.ko`命令可以查看此模块的vermagic等信息。2.6 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的 vermagic信息是否一致,两者一致时,模块才能被装载。譬如Fedora core 4 与core 2 使用的都是2.6 版本内核,在Fedore Core 2下去加载Fedora Core4下编译生成的hello.ko,会出现"invalid module format" 错误。
原处:[url]http://www-128.ibm.com/developerworks/cn/linux/l-module26/[/url]
解决了.
troyme
楼上说的很清楚了,内核版本和模块版本不一致的缘故