linux下模組編譯基本知識和格式
Make -c 只編譯不連結
Make -C切換到指定目錄再執行make過程
make -C $(LINUXROOT) M=$(PWD)
EXTRA_CFLAGS="$(EXTRA_FLAGS)" modules
當用戶需要以某個核心為基礎編譯一個外部模組的話,程式會自動到指定的dir目錄中查詢模組原始碼,將其編譯,產生ko檔案。
當連結一個模組時,必須用合適的地址替換在模組物件程式碼中引用的所有全域性核心符號,這個操作與在使用者態編譯程式時連結程式所執行的操作十分相似。
核心使用一些專門的核心符號表,用於儲存模組訪問的符號和相應的地址。它們在核心程式碼段中分三節:__kstrtab(儲存符號名),__ksymtab(所有模組可使用的符號地址),__ksymtab_gpl(GPL相容許可證下發布的模組可以使用的符號地址)。當用於靜態連結核心程式碼內時,EXPORT_SYMBOL與EXPORT_SYMBOL_GPL巨集讓C編譯器分別往__ksymtab和__ksymtab_gpl部分相應地加入一個專用符號。
已連結的模組可以匯出自己的符號,這樣其他模組就可以訪問這些符號。
當模組連結時,模組的匯出符號被拷貝到兩個記憶體陣列中,而其地址儲存在module物件的syms和gpl_syms欄位中。
insmod程式執行一下操作:1 從命令列中讀取要連結的模組名 2 確定模組物件程式碼所在的檔案在系統目錄樹中的位置。對應檔案通常在/lib/modules的某個子目錄中 3從磁碟讀入存有模組目的碼的檔案 4呼叫init_module系統呼叫,傳入引數:存有模組目的碼的使用者態緩衝區地址,目的碼長度和存有insmod程式所需要引數的使用者態記憶體區。
為了自動連結模組,核心要建立一個核心執行緒來執行modprobe外部程式,該程式要考慮由於模組依賴所引起的所有可能因素。
一個稱為depmod的外部命令在系統啟動時被執行。該程式查詢為正在執行的核心而編譯的所有模組,這些模組通常存在/lib/modules/目錄下。然後它就把所有的模組間依賴關係寫入一個名為modules.dep的檔案,這樣modprobe就可以對該檔案中存放的資訊和/proc/modules檔案產生的連結模組進行比較。