移植3.4.2內核—框架介紹及簡單修改
- 硬件平臺:韋東山嵌入式Linxu開發板(S3C2440.v3)
- 軟件平臺:運行於VMware Workstation 12 Player下UbuntuLTS16.04_x64 系統
- 參考資料:《嵌入式Linux應用開發手冊》
- 開發環境:Linux-3.4.2 內核、arm-linux-gcc-4.3.2工具鏈
目錄
一、安裝arm-linux-gcc 4.3.2工具鏈
用root用戶登錄
1、解壓
tar -zxvf arm-linux-gcc-4.3.2 tar.bz2 -C /
這樣解壓完成後的文件在:/opt/FriendlyARM/toolschain/4.3.2
路徑下(實際上在哪個目錄下都可以)。
2、移動
將上面解壓的4.3.2
目錄拷貝到/usr/local
cd /usr/local
mkdir arm
chmod 777 arm
cp -r /opt/FriendlyARM/toolschain/4.3.2 /usr/local/arm
3、修改環境變量
vi /etc/profile
export PATH=$PATH:/usr/local/arm/4.3.2/bin
4、生效
source /etc/profile
5、驗證
執行echo $PATH
查看環境變量
執行arm-linux-gcc -v
查看工具鏈版本號
6、可能出現的問題及解決辦法
-
問題:
若系統是32位,則按照以上步驟即可完成。
若是64位系統,可能會出現以下情況:
當輸入arm-linux-gcc -v 時,出現/usr/local/arm/4.3.2/bin/arm-linux-gcc: line 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No such file or directory。 -
原因:
這是因爲64位的系統缺少32位的庫導致的。 -
解決辦法:
sudo apt-get update
sudo apt-get install lib32z1
這樣就可以進行交叉編譯了。
二、配置內核
1、解壓
上傳內核壓縮包並解壓
tar xjf linux-3.4.2.tar.bz2
得到如下目錄linux-3.4.2
:
2、內核配置
2.1 修改Makefile
在/work/system/linux-3.4.2
目錄下vi Makefile
2.2 選擇默認配置
在此目錄下/work/system/linux-3.4.2/arch/arm/configs
會有這個文件s3c2410_defconfig
在/work/system/linux-3.4.2
目錄下,執行make s3c2410_defconfig
,最終會的到一個.config
文件
通過vi .config
可以看到,生成的配置文件中支持如下2440板子的配置
2.3 make uImage編譯
在/work/system/linux-3.4.2
目錄下,執行make uImage
,出現如下錯誤:
-
原因:
查了一下更新,發現其中有一項是perl版本升級到了 v5.22.1,然後查了perl官方文檔,發現官網因爲一個bug,該版本將defined(@array)去掉了。可以直接使用數組判斷非空。 -
解決方法:
打開在/work/system/linux-3.4.2/kernel
目錄下的timeconst.pl
修改: -
修改前
-
修改後
最終內核編譯成功
三、燒寫
1、問題
直接通過NFS網絡系統燒寫uImage,開發版啓動後出現如下問題:輸出的信息亂碼
nfs 0x30007FC0 192.168.1.2:/work/nfs_root/first_fs/uImage
bootm 0x30007FC0
2、解決辦法1:修改波特率
亂碼的最可能的原因就是波特率不一致,此時重啓啓動u-boot,執行如下命令,設置波特率
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
save
結果依舊是亂碼
3、解決辦法2:設置機器ID
- 先執行
set machid 16a
,這個機器ID是smdk2440(三星工板),可以看到機器ID已經成功設置
- 重啓開發板觀察,可以看到此時串口終於有輸出了。
4、其他原因
如果此時程序依舊是hi亂碼,可能是對應機器ID的內核源碼的時鐘頻率有關
到此爲止,新的內核燒寫進去,但是無法正常運行,後面會一步步解決這些問題。