非開源的驅動程式如何繞過version magic的檢查

最近在分析Linux核心模組與核心之間的版本耦合關係時,在開發kernel driver時,總是會遇到討人厭的vermagic檢查,只要目前在run的kernel版本跟driver編譯時用的kernel版本不一致,就沒辦法insmod。

比如要將第三方的驅動”ntfs.ko”加入帶android HoneyComb系統中。然後insmod。結果報錯:

version magic ’2.6.36-android-x86 SMP preempt mod_unload modversion PENTIUMM’ should be ’2.6.36-android-epc1015+ SMP preempt mod_unload ATOM’

version magic 是啥?Linux的是依靠核心模組構建時自動產生的“vermagic”標識檢查是否與當前核心版本一致的,如果不一致則拒絕載入。除非在 insmod/modprobe時指定參數強制忽略vermagic,但這樣做的代價是如果使用錯誤版本的核心模組就可能導致核心崩潰。

由於沒有源碼,只有ko檔。於是只能按照提示的錯誤資訊一步步配置kernel。首先把 CONFIG_LOCALVERSION配置成-android-x86。然後把Processor type and features的ATOM關掉打開PENTIUMM。這些可以通過圖形化介面來配置(make menuconfig),也可以直接修改.config檔,但前提你必須知道你所修改而產生的依賴項。個人建議用前者。

修改完後運行還是報錯。

version magic ’2.6.36-android-x86 SMP preempt mod_unload modversion PENTIUMM’ should be ’2.6.36- android-x86+ SMP preempt mod_unload PENTIUMM’

嗯?怎麼有加號“+”,參數CONFIG_LOCALVERSION明明沒有”+”.費了一番力氣最終確定是由kernel下scripts/setlocalversion檔產生的。簡單修改邏輯就ok了。

重新編譯運行”+”問題解決了。但是會出現error:

version magic ’2.6.36-android-x86 SMP preempt mod_unload modversion PENTIUMM’ should be ’2.6.36- android-x86 SMP preempt mod_unload PENTIUMM’

於是乎繼續看modversion的相關資訊,看了核心這部分的源代碼(include/linux/vermagic.h)

#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP “SMP “
#else
#define MODULE_VERMAGIC_SMP “”
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT “preempt “
#else
#define MODULE_VERMAGIC_PREEMPT “”
#endif
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD “mod_unload “
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD “”
#endif
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS “modversions “
#else
#define MODULE_VERMAGIC_MODVERSIONS “”
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC “”
#endif

發現了兩種不同截然的處理方式,由一個核心構建宏“CONFIG_MODVERSIONS”所控制。在它關閉的情況下,載入核心模組時,將對 vermagic作全字串的完整匹配,任何不一致均會阻止該核心模組的載入;而倘若這個宏被開啟,則只有vermagic第一個空格之後的部分會參與匹 配,也就是說形如“2.6.36-”這一段核心版本標識其實並不要求一致。事實上,當上述宏開啟後,除了對vermagic後半段的匹配性檢查外,核心還 會進行額外的“核心介面指紋”檢驗,才最終決定是否允許載入該核心模組。

而若想知曉一個核心模組是否包含指紋資訊,則需要用到modprobe的下面這個參數:

modprobe –dump-modversions <module>

   因此,MODVERSIONS可以作為版本不配套時的後備選擇(尤其對非開源的驅動程式),但不能依賴它作為相容性的判定依據。

   初次寫博客,難免會有各種不足,歡迎大家批評指正!

    原創文章,如需轉載請注明【大雄的博客】:http://wangliping.net/owen/blog/ 

    本文地址:http://wangliping.net/owen/blog/2011/04/08/linux-version-magic

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()