接下來我們就進(jìn)行內(nèi)核代碼的初次編譯,直接使用我們適配好的Linux內(nèi)核源碼進(jìn)行編譯。為了使編譯操作更加簡單,我們提供了編譯腳本,將編譯操作命令放進(jìn)了腳本中執(zhí)行,直接執(zhí)行編譯腳本文件build.sh即可完成代碼的編譯。我們先了解一下編譯腳本的內(nèi)容。使用vi命令打開build.sh腳本:
elf@ubuntu:~/work/linux-4.1.15-elf1$ vi build.sh
build.sh腳本內(nèi)容如下:
#!/bin/bash
export CPUS=`grep -c processor /proc/cpuinfo`
source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make distclean
make imx6ull_elf1_defconfig
make -j${CPUS}
rm -rf ./.tmp
make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
cd .tmp/rootfs/
tar -jcvf modules.tar.bz2 *
第2行,獲取到當(dāng)前Ubuntu虛擬機(jī)CPU的核心數(shù)量,并賦值給變量CPUS;
第3行,執(zhí)行環(huán)境變量,使用arm的gcc工具編譯當(dāng)前內(nèi)核。注意:在腳本當(dāng)中執(zhí)行的環(huán)境變量只在當(dāng)前腳本內(nèi)生效,單獨編譯鏡像時仍需要執(zhí)行環(huán)境變量;
第4行,編譯前清理工程;
第5行,使用imx6ull_elf1_defconfig配置當(dāng)前工程,執(zhí)行后在當(dāng)前路徑下生成.config文件;
第6行,執(zhí)行”make”,編譯Linux源碼,后面的”-j${CPUS}”為使用當(dāng)前虛擬機(jī)的所有核心一起編譯;
第8-11行,將編譯生成的.ko模塊使用make modules_install命令安裝到./.tmp/rootfs/目錄下,并壓縮打包,生成modules.tar.bz2。?
整體編譯內(nèi)核
elf@ubuntu:~/work/linux-4.1.15-elf1$ ./build.sh
編譯完成之后,會在arch/arm/boot/目錄下生成zImage文件,就是內(nèi)核鏡像文件;在arch/arm/boot/dts/下生成多個.dtb設(shè)備樹二進(jìn)制文件;以及在某些驅(qū)動目錄下生成.ko模塊。編譯完成后,生成的文件以及路徑會在下篇文章進(jìn)行說明。
單獨編譯內(nèi)核
在調(diào)試過程中我們會經(jīng)常需要更改內(nèi)核配置或者單獨編譯zImage、dtb、ko模塊,那么直接執(zhí)行上面build.sh編譯腳本進(jìn)行全部編譯就不太合適了,就需要更改此腳本或者單步編譯。
設(shè)置交叉編譯環(huán)境
注意:
- 設(shè)置環(huán)境變量之后,只要不更換終端,下次再編譯就不需要重新設(shè)置。
- 如果重新打開新終端或者切換賬戶,編譯前需要重新設(shè)置環(huán)境變量。
設(shè)置編譯環(huán)境主要是指定目標(biāo)架構(gòu)和交叉編譯工具鏈,以及編譯過程中使用到的一些庫的路徑等,使用如下命令配置(.后邊有空格):
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
更改內(nèi)核配置
Linux內(nèi)核編譯之前需要進(jìn)行配置,腳本中已經(jīng)有默認(rèn)的配置。往往我們需要根據(jù)自己的需求進(jìn)行內(nèi)核配置,接下來我們看一下如何進(jìn)行內(nèi)核配置的更改。更改內(nèi)核配置就是根據(jù)自己的需要,將內(nèi)核中的驅(qū)動、軟件包、組件等功能模塊進(jìn)行裁剪或者添加??墒褂胢ake menuconfig命令生成圖形界面進(jìn)行修改。如果想要對內(nèi)核進(jìn)行重新配置,就需要先執(zhí)行,make imx6ull_elf1_defconfig命令生成.config,然后使用圖形界面進(jìn)行配置,執(zhí)行命令:
elf@ubuntu:~/work/linux-4.1.15-elf1$ make menuconfig
此圖形界面所呈現(xiàn)的配置選項的菜單列表來源于Kconfig文件(下面章節(jié)會講到),這些配置選擇,就是根據(jù).config讀取出來的,我們也可以通過配置選項進(jìn)行配置:
(1)Y(將該功能編譯進(jìn)內(nèi)核);
(2)N(不將該功能編譯進(jìn)內(nèi)核);
(3)M(將該功能編譯成可以在需要時動態(tài)插入到內(nèi)核中的模塊);
三種選擇根據(jù)實際需求進(jìn)行配置,最后在保存退出的時候,會把最新的配置更新到.config中,此時可以把.config文件中配置復(fù)制到imx6ull_elf1_defconfig默認(rèn)配置文件,否則在下次編譯前在執(zhí)行make distclean的時候會把最新的.config清除掉,我們還需要重新配置。
單獨編譯內(nèi)核鏡像zImage
elf@ubuntu:~/work/linux-4.1.15-elf1$ make zImage -j4
單獨編譯設(shè)備樹
elf@ubuntu:~/work/linux-4.1.15-elf1$ make dtbs –j4
單獨編譯模塊
elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules -j4
安裝模塊到./.tmp/rootfs/文件夾中
elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
打包模塊
elf@ubuntu:~/work/linux-4.1.15-elf1$ cd .tmp/rootfs/
elf@ubuntu:~/work/linux-4.1.15-elf1$ tar -jcvf modules.tar.bz2 *