本教程旨在引導您完成Linux內核和busybox的編譯,以及使用QEMU啟動內核的過程。為了確保學習的流暢性,建議在VirtualBox運行的Ubuntu 22.04.3 LTS上測試本教程。理解makefile的原理和使用方法將有助於您更好地執行後續的「make」命令。
首先,准備編譯所需的文件和環境。新建文件夾存放所有文件,並下載Linux內核源碼(版本6.7.5)和busybox源碼(版本1.36.1)。解壓這些壓縮包,確保目錄結構清晰。將這些文件放置在新建的文件夾內,本教程中將此文件夾稱為「主目錄」,以方便描述。
接下來,開始編譯Linux內核。在「主目錄」中,確保已安裝所有必要的依賴項。使用命令「make -j8」在Linux內核文件夾下運行編譯命令(注意:此命令需在「linux-6.7.5」文件夾下執行,且電腦CPU為i5-13400,虛擬機分配8個核心)。對於AMD 7840hs真機,使用「make -j12」命令,編譯時長約為1分鍾。編譯成功後,內核會生成名為「bzImage」的文件,記住其輸出路徑,後續步驟將使用到。
在完成內核編譯後,緊接著編譯busybox。無需額外依賴,直接執行編譯過程。在「busybox-1.36.1」文件夾下運行命令,選擇靜態二進制構建選項以確保內核精簡性,以便在QEMU上運行。快速編譯完成後,生成的文件位於「busybox-1.36.1/_install」目錄下。
接下來,安裝QEMU模擬器。安裝完成後,准備製作文件系統,以運行內核。在「busybox-1.36.1/_install」目錄下,選擇一種製作文件系統的方式:一種是快速但會丟失更改,另一種是麻煩但可保存更改並永久存儲。首先實現快速方式。
在「busybox-1.36.1/_install」目錄下,找到並使用initramfs.cpio.gz文件。在「主目錄」中啟動QEMU模擬器。運行過程中,可以通過命令行輸入簡單命令驗證系統功能。嘗試新建文件並關閉系統,重啟後發現文件消失,因為內存系統在重啟後會清空。
為了實現永久保存數據功能,分配磁碟文件並製作一個磁碟文件。在「主目錄」內運行相關命令,創建磁碟文件後,內核操作磁碟的數據將被永久保存。再次運行模擬器並驗證文件持久性。
為了簡化後續操作,提供了一個makefile文件,放置在「主目錄」下。運行該makefile啟動命令,方便管理和操作。
Ⅱ 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驅動是否成功編譯到內核中。