內核模塊版本和內核版本不一致的處理方法


內核版本是如何生成的:

    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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM