模組是Linux核心支援的一種動態載入的組件,大多數的模組是驅動程式。而且Linux的模組設計成可以堆疊式的----就是一個模組運行在另一個模組之上,這個模組也可能再為它上面的模組提供支援,當然所有的模組又都運行在核心之上。這樣一來一個模組就可能依賴於另一個模組提供的服務,或者核心提供的服務。在安裝這個模組時,安裝程式就需要知道這些依賴關係並先於模組本身,安裝其他依賴的模組。下面的程式和檔案完成整個模組安裝和維護過程
modules.dep 模組依賴資訊,位於/lib/modules/<kernel version>/
modprobe 安裝模組程式,他自動讀取目前的版本核心的核心模組modules.dep並,安裝模組和依賴的模組。
insmod 極簡單的安裝模組程式,他只是安裝模組並不做任何依賴性處理,實用性不大,modprobe更聰明一些
depmod 模組依賴資訊維護程式 ,他根據當前/lib/modules/<kernel version>/ 的模組資訊產生或更新modules.dep,正常情況下,當編譯完核心時,make modules_install的結尾部份將執行depmod.
System.map 核心匯出符號表,詳細內容下面介紹。
如果想要安裝一個已編譯好的核心模組,典型過程如下:
將這個編譯好的模組cp到/lib/modules/`uname -r`/kernel/driver/mymod/ 目錄中,然後
運行depmod產生模組依賴,最後運行 modprobe
可以執行如下命令實現:
root# mkdir -p /lib/modules/`uname -r`/kernel/driver/mymod #注意不是單引號,是反引號。
root# cp <my_module.ko> /lib/modules/`uname -r`/kernel/driver/mymod/
root# depmod -eF /boot/System.map-`uname -r` -A #注意是否存在/boot/System.map-<verion number>,沒有的話需要從核心編譯後的映像所在目錄copy過來。實在沒有的話用depmod -A代替。但結果可能不準確。
root# modprobe -v my_module #注意觀察輸出的資訊,看載入模組是否成功,另外modprobe比insmod更聰明,insmod太簡單沒有什麼實用價值
如果仍然出現段錯誤,基本上可以證明該模組不能工作於目前的核心。
為了避免出現段錯誤,最安全的做法,重新編譯核心並開啟下面兩個選項
[*] Module versioning support
[*] Source checksum for all modules
確保核心拒絕不相容的模組
然後重複前面的步驟,這時modprobe將拒絕安裝不相容的模組,也就是說,這時如果成功安裝,那麼就決不會出現段錯誤。否則,modprobe或insmod會失敗。
System.map是在編譯核心時產生的,記錄核心的匯出符號.
depmod -A可以以追加方式產生模組依賴modules.dep.但是它只能產生模組之間的依賴,對於模組中出現的其他模組也沒有提供的未解決符號,depmod不再進行解析,認為這個符號由核心提供,事實上,這個未解決符號核心可能也沒有提供,這時運行時就可能出現段錯誤。
如果用-eF System.map選項後,depmod除了會在模組間解析符號外,還會對照核心匯出符號表System.map來更精確的確定哪些符號是真正無法解決的符號。並在標準輸出上給出這些未解決符號的資訊。