赞
踩
内核版本是如何生成的:
Linux 内核在进行模块装载时先完成模块的 CRC 值校验,再核对 vermagic 中的字符信息,linux版本:在linux/utsrelease.h
中定义,文件中的内容如下:#define UTS_RELEASE "2.6.35.7-perf+"
,utsrelease.h是kernel编译后自动生成的,用户更改里面的内容不会有效果。
在init/version.c
中,定义了kernel启动时的第一条打印信息:
- /* FIXED STRINGS! Don't touch! */
- const char linux_banner[] =
- "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
- LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
这里UTS_RELEASE在kernel编译时自动生成
在init/main.c
的start_kernel函数中,有kernel启动的第一条打印信息,这条信息是dmesg命令打印出来:
printk(KERN_NOTICE "%s", linux_banner);
方法二:
驱动模块的version magic信息是怎么生成的:
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信息是否一致,两者一致时,模块才能被装载。为了使两个版本一致:可以把 依赖源码中的include/linux/vermagic.h
中的UTS_RELEASE修改成与目标机器的版本一致,这样,再次编译模块就可以了。
utsrelease.h是一个自动生成的文件,没有办法修改,但这个数据是根据Makefile和.config的内容进行生成的,通过修改这两个文件的内容,可以改变!
- /usr/src/linux/Makefile:
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 39
- EXTRAVERSION = -gentoo-r3
- ......
- /usr/src/linux/.config:
- CONFIG_LOCALVERSION="-debug"
然后,执行make时:
- localhost linux # make
- scripts/kconfig/conf --silentoldconfig Kconfig
- CHK include/linux/version.h
- CHK include/generated/utsrelease.h
- UPD include/generated/utsrelease.h
对应的utsrelease.h的内容为:
#define UTS_RELEASE "2.6.39-gentoo-r3-debug"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。