Linux 模塊檢測

在公司一個項目中,需要提供給合作方linux內核用於編譯他們的內核模塊,由於我們的內核是板一級移植,加入了一些重要的信息,這部分信息不能透漏給他人。根據之前的瞭解模塊安裝時會進行版本的檢測。當編譯驅動用的內核和加載驅動用的內核不一致時就會出現 version magic 'xxxxx' should be 'xxxxxx'的字樣。首先想到的就是讓內核版本變得一致。內核的版本信息都記錄在include/linux/vermagic.h。

  1 #include <generated/utsrelease.h>
  2 #include <linux/module.h>
  3
  4 /* Simply sanity version stamp for modules. */
  5 #ifdef CONFIG_SMP
  6 #define MODULE_VERMAGIC_SMP "SMP "
  7 #else
  8 #define MODULE_VERMAGIC_SMP ""
  9 #endif
 10 #ifdef CONFIG_PREEMPT
 11 #define MODULE_VERMAGIC_PREEMPT "preempt "
 12 #else
 13 #define MODULE_VERMAGIC_PREEMPT ""
 14 #endif
 15 #ifdef CONFIG_MODULE_UNLOAD
 16 #define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
 17 #else
 18 #define MODULE_VERMAGIC_MODULE_UNLOAD ""
 19 #endif
 20 #ifdef CONFIG_MODVERSIONS
 21 #define MODULE_VERMAGIC_MODVERSIONS "modversions "
 22 #else
 23 #define MODULE_VERMAGIC_MODVERSIONS ""
 24 #endif
 25 #ifndef MODULE_ARCH_VERMAGIC
 26 #define MODULE_ARCH_VERMAGIC ""
 27 #endif
 28
 29 #define VERMAGIC_STRING                         \
 30     UTS_RELEASE " "                         \
 31     MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \
 32     MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS   \
 33     MODULE_ARCH_VERMAGIC

編譯模塊時會產生一個*.mod.c文件。MODULE_INFO(vermagic, VERMAGIC_STRING);中的VERMAGIC_STRING用的就是29行中的宏定義。根據這個宏定義就清楚了應該保證哪一些信息一致。比如我將MODULE_ARCH_VERMAGIC改成我們的板子的信息,用這個純淨的內核編譯的模塊能被我用的內核加載。當然編譯內核時要選對Machine和CPU相關的信息。我們的CPU是MIPS結構,可以在arch/mips/configs找一個config文件,用這個config文件配置內核,然後make menuconfig繼續修改。

Linux 對可裝載模塊採取了兩層驗證:模塊的 CRC 值校驗和 vermagic 的檢查。CONFIG_MODVERSIONS設爲N可以關掉CRC校驗。

其中preempt是便攜的意思。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章