2012-01-05 77 views

回答

52

切換到你的源代碼樹的根目錄,然後運行以下命令:

$ make modules SUBDIRS=drivers/the_module_directory 

並安裝編譯的模塊:

$ make modules_install SUBDIRS=drivers/the_module_directory 

注:作爲lunakid提到,後者命令可能是而不是先構建模塊,所以要小心。

+0

(只要確保你運行的是,在樹根,不像我。)) – 2014-05-12 12:17:41

+0

@lunakid好一點;)雖然它應該是很清楚,'SUBDIRS'相對於CWD :P – 2014-05-12 12:19:33

+0

這絕對是清楚的,但我仍然發現自己最終坐在wacom驅動程序目錄中。 :)只是不看我的步驟。另外,你可以添加到你的答案,它也可以**安裝**相同的方式,只是把'make modules_install SUBDIRS = ...'。這幾乎可以肯定是下一步,並且可能不會馬上變得微不足道(即使看起來如此,例如,在我花了幾分鐘的時間用google搜索它後:))。 Thx,歡呼! – 2014-05-12 12:27:10

7

您可以將路徑傳遞到模塊名稱或模塊目錄作爲參數。

make path/to/the/module/itself.ko 
make path/to/the/module/directory/ 
+1

make path/to/the/module/itself.ko比make模塊SUBDIRS = directory/path(3 minuts vs 5 seconds)需要更多的時間。實際上,make path/to /目錄似乎不起作用,它總是說「沒事做」,但我修改了代碼 – 2015-06-07 18:25:04

5

因爲內核版本3.xx的4.XX的程序變得更復雜(但有一個希望,所以請繼續閱讀):

  1. make distclean如果你還沒有剛剛克隆了一個新源,但用於構建其他模塊
  2. 爲模塊源創建新文件夾(例如:多餘) 並僅複製源文件(從內核源文件或其他地方)需要建立到這個新文件夾
  3. 複製/boot/config-``uname -r文件(例如:/boot/config-4.8.0-46-generic)到內核源文件夾文件.config並運行make oldconfig。如果模塊屬於內核源代碼,驗證是否已通過調用make menuconfig啓用,通過搜索模塊和應用字母「M」如果有必要
  4. 內核源根的Makefile必須用準確版本組件匹配改變當前運行的一個(你可以用make kernelversion驗證它是否完全匹配的uname -r之一)
  5. 有過強烈的暗示與 make scripts
  6. make preparemake modules_prepare之前也構建腳本,必須以實際的模塊之前執行建立
  7. Module.symvers必須從目標系統頭夾相應的正在運行的內核版本/usr/src/linux-headers-``uname -r``/Module.symvers複製(例如:/usr/src/linux-headers-3.13.0-117-generic/Module.symvers)插入爲模塊編譯準備的新創建的模塊源文件文件夾(例如,一個額外的)。
  8. 創建新生成文件具有模塊源代碼編譯的文件夾下面的行內:obj-y += <module_source_file_name>.o或如果源代碼是複雜的,從here
  9. 使用指引那麼它的構建模塊用make -C <kernel source path> M=the_module_directory合適的時間(例如:make -C . M=extra/
  10. 使用命令modprobe --dump-modversion <module_name>.ko驗證模塊出口API和相應的值之間CRC匹配在Module.symvers
  11. 驗證是否kernel.release文件內容與當前運行版本的標題完全匹配。如果您在末尾發現+,這意味着您一直在編譯git clonned源代碼,並且您的實驗性修改導致構建系統在最後添加+以損害localversion字符串。
  12. 如果只+已在kernel.release儲值的尾巴被發現,它是與目標運行的內核的確切名稱不匹配,

的解決辦法是以下幾點:

提交所有更改,使用git tag -a <tag version> -f命令強制釋放標記以改變您的修改。然後從步驟重建模塊8