1. 程式人生 > >安卓核心驅動編譯的方法——自我感悟

安卓核心驅動編譯的方法——自我感悟

學習linux的時候,一般有兩種方法。一種是配置Kconfig與Makefile檔案,接著使用make menuconfig來實現核心的新增。還有一種是將驅動編譯為.ko檔案,通過insmod的方式來載入。

可最近在編譯安卓原始碼,發現這樣子行不通。當讓,第二種方法是可以的。需要用adb工具,將驅動檔案新增到手機內部,然後載入,這種方式對於要調TP驅動的我來說不是很方便。於是嘗試使用第一種方法,make menuconfig,接著就在kernel目錄下產生了.config檔案,與在kernel/include/下產生了config的空資料夾。前者用來存放要編譯的驅動資訊,後者不知道。

在新增完驅動後,在安卓頂層目錄下編譯核心:make kernel 2>1& | tee log.txt  結果出現錯誤

is not clean, please run 'make mrproper'  經過查詢原因:grep -nR "is not clean, please run 'make mrproper'" *   發現是kernel頂層目錄的Makefile檔案裡的提示語句。於是刪除上述兩個檔案.config與config資料夾。再次編譯,沒有報錯。

這樣就產生了矛盾,於是在第一種方法的基礎上不使用make menuconfig。在kernel/arch/arm/configs/目錄下有對應平臺的字尾為decongfig檔案,在檔案中新增選項並賦值為y即可。如果想檢視檔案是否被編譯,則在檔案中新增錯誤的程式碼,編譯報錯則代表成功。

轉念一想,驅動的Makefile都是有固定格式的,如obj-y += 檔名.o  表示將驅動編譯進核心,obj-m += 檔案名.o 表示將驅動編譯成模組。這樣子,我們只需要將Makefile檔案中的變數直接用y來代替即可,這樣就可以將驅動編譯進核心。當然,這樣做要保證需要編譯的部分已經在Makefile的編譯流程中。

如果是子目錄,就需要被上級目錄的Makefile所包含。可以在確定會被編譯的目錄中新建一個子目錄xxx,在當前資料夾下的Makefile 中新增 obj-y +=xxx/ 。然後在xxx目錄下新建Makefile,在Makefile 中新增 obj-y += 檔名.o 即可。

下圖作為參考