內核版本是如何生成的:
Linux 內核在進行模塊裝載時先完成模塊的 CRC 值校驗,再核對 vermagic 中的字符信息,linux版本:在linux/utsrelease.h中定義,文件中的內容如下:#define UTS_RELEASE "2.6.35.7-perf+",utsrelease.h是kernel編譯后自動生成的,用戶更改里面的內容不會有效果。
在init/version.c中,定義了kernel啟動時的第一條打印信息:
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修改成與目標機器的版本一致,這樣,再次編譯模塊就可以了。
參考:
http://blog.sina.com.cn/s/blog_6e5e78bf010105jj.html
http://blog.csdn.net/armeasy/article/details/6027563