① linux怎麼編譯進驅動進內核
在Linux內核中增加程序需要完成以下三項工作:
1. 將編寫的源代碼復制到Linux內核源代碼的相應目錄;
2. 在目錄的Kconfig文件中增加新源代碼對應項目的編譯配置選項;
3. 在目錄的Makefile文件中增加對新源代碼的編譯條目。
以bq27501驅動編譯到內核中為例,具體步驟如下:
1. 首先將bq27501驅動代碼文件夾復制到ti-davinci/drivers/目錄下。確定bq27501驅動模塊應在內核源代碼樹中處於何處。設備驅動程序存放在內核源碼樹根目錄drivers/的子目錄下,按照類別、類型等有序地組織。
2. 在bq27501目錄下新建一個Makefile文件,向裡面添加代碼:obj-$(CONFIG_BQ27501)+=bq27501.o,此時構建系統運行將進入bq27501目錄下,編譯bq27501.c為bq27501.o。
3. 在bq27501目錄下新建Kconfig文件,添加代碼:menu "bq27501 driver" config BQ27501 tristate "BQ27501" default y ---help--- Say 'Y' here, it will be compiled into the kernel; If you choose 'M', it will be compiled into a mole named as bq27501.ko. endmenu。
4. 修改drivers目錄下的Kconfig文件,在endmenu之前添加一條語句「source drivers/bq27501/Kconfig」。對於驅動程序,Kconfig通常和源代碼處於同一目錄。若建立了一個新的目錄,而且也希望Kconfig文件存在於該目錄中的話,那麼就必須在一個已存在的Kconfig文件中將它引入,需要用上面的語句將其掛接在drivers目錄中的Kconfig中。
5. 修改drivers目錄下的Makefile文件,添加「obj-$(CONFIG_BQ27501) +=bq27501/」。這行編譯指令告訴模塊構建系統在編譯模塊時需要進入bq27501子目錄中。此時的驅動程序的編譯取決於一個特殊配置CONFIG_BQ27501配置選項。
6. 修改arch/arm目錄下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加語句「source "drivers/bq27501/Kconfig"」。
注意:此處的文件組織規則並非絕對不變,例如:USB設備也屬於字元設備,也可以存放在drivers/usb/目錄下。在drivers/char/目錄下,在該目錄下同時存在大量的C源代碼文件和許多其他目錄。所有對於僅僅只有一兩個源文件的設備驅動程序,可以直接存放在該目錄下,但如果驅動程序包含許多源文件和其他輔助文件,那麼可以創建一個新子目錄。bq27501的驅動是屬於字元設備驅動類別,雖然驅動相關的文件只有兩個,但是為了方便查看,將相關文件放在了bq27501的文件夾中。在drivers/char/目錄下增加新的設備過程比較簡單,但是在drivers/下直接添加新的設備稍微復雜點。所以下面首先給出在drivers/下添加bq27501驅動的過程,然後再簡單說明在drivers/char/目錄下添加的過程。
在完成上述步驟後,需要重新編譯內核。使用如下命令:
make menuconfig
make
make moles_install
make install
最後,需要在/boot/grub/grub.cfg文件中添加啟動項,以便在啟動時選擇新的內核版本。編輯grub.cfg文件,添加如下內容:
menuentry "Linux-4.19.75" {
linux /boot/vmlinuz-4.19.75 root=/dev/sda3
initrd /boot/initramfs-4.19.75.img
}
保存並退出編輯器,然後運行update-grub命令以更新GRUB配置。重啟系統,選擇新的內核版本啟動,驗證bq27501驅動是否成功編譯到內核中。
② linux Kbuild詳解系列(0) - 內核的編譯操作
歡迎進入Linux內核編譯操作的探索之旅!此系列博客將詳盡闡述Linux內核從編譯到安裝的全過程,重點介紹Linux的Kbuild系統。Kbuild系統復雜性較高,理解它對於深入Linux內核配置、調試及開發大有裨益。建議閱讀本系列前先回顧Makefile知識。
學習Linux內核編譯安裝機制,能夠為後續配置、調試及開發奠定堅實基礎。我們從內核編譯操作開始,逐步深入。
我們先從下載源碼談起。Linux源碼託管在GitHub,通過在搜索欄輸入「torvalds/linux」即可找到主線代碼。
下載源碼後,進入根目錄,執行配置步驟。配置為何重要?因為它允許用戶選擇各種功能模塊,如存儲、時鍾、外設等,靈活裁剪內核大小,滿足不同設備需求。
配置通常涉及選擇模塊,包括平台選擇。配置命令在根目錄執行,生成的.config文件記錄所有配置選項,為編譯器提供內核源碼編譯依據。
在嵌入式開發中,通常採用交叉編譯,以提高效率。交叉編譯在功能強大的PC機上進行,編譯成果在目標開發板上運行。架構差異要求對編譯器進行適配。
編譯過程需考慮目標平台與交叉編譯器。配置後生成鏡像文件vmlinix。鏡像根據架構不同,可進一步處理為vmlinuz、Image、zImage、bzImage等。
配置階段將模塊分為內核編譯與外部模塊。內核編譯模塊直接存在於鏡像中,外部模塊需載入後使用。
編譯後需將內核和模塊安裝至目標平台。鏡像文件根據架構不同而異,通常通過替換或定製系統文件完成安裝。模塊安裝遵循相似流程,可能需復制至特定目錄。
內核編譯與安裝關鍵步驟包括:
同時,嵌入式開發中需關注交叉編譯。通過此系列,希望您對Linux內核編譯過程有更深入的理解與掌握。