(一)目的
在進行嵌入式開發的時候,我們往往會先在電腦上安裝交叉編譯器,然后編譯目標板上的代碼,最后把代碼下載到電路板中,嵌入式系統組成包括:BootLoader+kernel+filesystem+application,前面我們已經制作好了BootLoader,這一節我們制作一個kernel鏡像
(二)工具
- linux-3.5版本內核
- Ubuntu 16.04
- linux交叉編譯環境(我已經安裝過,沒有安裝的可以下載arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)
這里說明一點我們獲取linux內核一般可以從linux官方獲取,或者從開發板的廠商那獲取,我比較推薦第二種,因為第一種還需要我們進行有關硬件的配置
(三)操作流程
1、將linux-3.5-20141114.tar拷貝到Linux系統中
2、解壓linux-3.5-20141114.tar
tar -xvf linux-3.5-20141114.tar
3、進入解壓后的目錄
make menuconfig:打開配置界面,若無法打開需要安裝庫
apt install ncurses-dev
運行make menuconfig打開上面的窗口可以進行內核功能的刪減
按下面的步驟修改一個地方:
System Type --->
[ ] Support TrustZone-enabled Trusted Execution Environment //按空格取消該模塊
4、修改內核的頂層Makefile
因為最終內核運行到arm開發板,編譯需要在PC端,所以需要使用到交叉編譯器,在Makefile里指定交叉編譯器為arm-linux-
5、拷貝Linux3.5目錄下的tiny4412_linux_defconfig為默認配置文件
cp tiny4412_linux_defconfig .config
6、編譯內核
make -j8
若出現一下錯誤:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/driver/linux-3.5/kernel/Makefile:133: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
make[1]: *** 正在等待未完成的任務....
修改kernel/timeconst.pl的373行:
if (!defined(@val)) {@val = compute_values($hz);}
為
if (@val) {@val = compute_values($hz);}
7、燒寫內核到SD卡
編譯完成會提示:Kernel: arch/arm/boot/zImage is ready
將SD卡插入讀卡器并連接到Ubuntu
cd arch/arm/boot
dd iflag=dsync oflag=dsync if=./zImage of=/dev/sdb seek=1057
大概持續40秒
8、驗證是否燒寫成功
將SD卡拔出插到自己的開發板上驗證,啟動后在串口里會提示內核啟動的流程即為成功