Tiny4412 ARM開發環境搭建—NFS網路根檔案系統製作
阿新 • • 發佈:2019-01-22
Tiny4412從SD卡啟動的簡單網路檔案系統製作
1. 簡介
嵌入式系統能夠在開發板上正常執行,需要先進行系統配置,一個完整的嵌入式系統應該包含的幾個部分::uboot,kernel,rootfs,appfs。這幾部分在ARM板Flash上的位置關係如下圖所示:
注:圖片來源於韋東山老師的《嵌入式Linux應用開發完全手冊》
rootfs可以不用新增到開發板,而是部署到PC機上,開發板在執行完kernel,要掛載rootfs時,可以通過NFS網路掛載到設定好的PC機上的檔案系統上。
作業系統: 核心 + 檔案(應用, 配置, 裝置, ...); bootloader: u-boot (互動介面) # lsX help kernel : linux (沒有互動) filesystem: rootfs android qt_rootfs ... .... .... shell
2. 安裝工具
需要用到的安裝工具包及原始碼包如下:
2.1 安裝交叉編譯工具
交叉編譯:在PC機(x86平臺)上開發程式,在ARM板上執行,提高開發、編譯速度。
在編譯uboot、核心、busybox、程式檔案之前需要安裝相容開發板的交叉編譯工具
檢測系統是否已經安裝有交叉編譯環境:
# arm-linux-gcc -v
bash: arm-linux-gcc: command not found
安裝步驟:
1. 找到arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 所在路徑,並解壓壓縮檔案
# tar xf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
# ls
arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz opt
// 解壓後得到一個opt資料夾
- 在usr/local/目錄下建立資料夾,並將解壓縮的資料夾./opt/FriendlyARM/toolschain/4.5.1/拷貝到/usr/local/arm/目錄:
# mkdir /usr/local/arm
# cp opt/FriendlyARM/toolschain/4.5.1/ /usr/local/arm/ -rf
- 修改環境變數:
# vim /root/.bash_profile
// 在檔案末尾新增:
PATH=/usr/local/arm/4.5.1/bin/:$PATH
export PATH
- 登出使用者,重新登入使用者後生效
或者:
# source /root/.bash_profile
// 使配置檔案生效
- 檢查交叉編譯環境是否安裝成功:
# arm-linux-gcc -v
......
gcc version 4.5.1 (ctng-1.8.1-FA)
// 交叉編譯環境安裝成功
檢測到交叉編譯環境版本為4.5.1,安裝成功。
2.2 Minicom串列埠工具安裝及配置
2.3 安裝fastboot工具
2.4 安裝NFS服務
現在多數Linux發行版都會自帶NFS服務,一般系統安裝時都會預設安裝NFS服務,如果沒有安裝請查詢資料自行安裝,此處不再敘述NFS安裝方法。
2.5 關閉防火牆
使用NFS網路檔案系統需要系統關閉防火牆,否則,系統啟動過程會失敗。
4. 編譯核心
Tiny4412編譯核心linux-3.5後,將zImage燒寫到SD卡中,啟動過程中會出現卡死的現象
在kernel編譯的時候將TrustZone模組去掉,之後再編譯,再燒寫
5. 編譯uboot並製作SD卡
參考Tiny4412光碟資料README for FriendlyARM Tiny4412
5.1 Build uboot
a) 安裝好toolchain
(arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)
並設定好環境變數PATH,保證可以正常使用。
b) 解壓 uboot_tiny4412-20130929.tgz 並進入相應的目錄
# tar xzf uboot_tiny4412-20130929.tgz
# ls
uboot_tiny4412_0929 uboot_tiny4412-20130929.tgz
c) 配置 uboot 並編譯
# cd uboot_tiny4412
# make tiny4412_config
# make
d) 編譯 用於生成bl2 的工具
# make -C sd_fuse
或者
# cd sd_fuse; make
5.2 製作啟動 Tiny4412 的SD卡
a) 先準備一張4G或以上的SDHC卡
注意:該卡的已有資料將會被破壞,因此請先對SD卡上的資料進行備份。
b) 如果SD卡容量大於等於32G
# cd uboot_tiny4412_0929/sd_fuse/tiny4412
# vim sd_fusing.sh
36 if [ ${BDEV_SIZE} -gt 32000000 ]; then
37 echo "Error: Block device size (${BDEV_SIZE}) is too large"
38 # exit 1
39 fi
將判斷SD卡容量中的處理exit 1註釋掉。
c) fusing SD card
# 假設SD卡已被PC Linux識別為/dev/sdb, 以root使用者執行以下命令即可:
# cd sd_fuse/tiny4412
# ./sd_fusing.sh /dev/sdb
5.3 使用SD卡啟動 Tiny4412
a) 將已經制作好的SD卡插到Tiny4412板上,撥動S2切換到SDBOOT,同時連線串列埠線到PC且假設已經準備好。
b) 開發板加電,然後在串列埠控制檯(如:Minicom),按任意鍵進入uboot命令列模式
c) 對SD卡進行分割槽
輸入以下uboot命令即可對SD卡進行分割槽:
# fdisk -c 0 320 806 518
重新分割槽後,可重新格式化FAT分割槽
# fatformat mmc 0:1
5.4 使用fastboot工具燒寫核心
a) 進入fastboot模式以燒寫核心映象
使用USB線連線Tiny4412的MICRO_USB口到PC,然後輸入以下uboot命令:
# fastboot
b) 燒寫核心映象到SD卡
首先準備好的核心映象zImage,進入zImage所在的資料夾
在PC端輸入以下命令進行燒寫:
# fastboot flash kernel zImage (燒寫kernel)
6. 製作簡單的網路檔案系統
6.2 NFS服務配置
6.3 使用busybox編譯出命令
解壓縮:
# tar xf busybox-1.17.2-20101120.tgz (linux基本命令)
# cd busybox-1.17.2
編輯:
配置:
make defconfig (預設)
make menuconfig (修改預設配置)
Busybox Settings --->
-> Build Options
-> (arm-linux-) Cross Compiler prefix
^^^^^^^^^^ 交叉編譯
arm-linux-gcc 指定編譯工具為交叉編譯器;
在busybox中新增命令:rmmod insmod lsmod
Linux Module Utilities --->
[ ] Simplified modutils
[*] insmod
[*] rmmod
[*] lsmod
[*] Pretty output
[*] modprobe
[*] Blacklist support
[*] depmod
make
make install
或者:
make && make install
^ ^
編譯 安裝(拷貝)
注意: 編譯完時提示; 執行程式需要的依賴庫;
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
安裝完時提示
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
拷貝安裝完的命令:
cp ./_install/* /nfsroot -rf
到這裡去執行編譯好的程式,會提示執行失敗????
是因為在編譯時,選擇使用動態連結;要解決該問題,需要將交叉編譯工具中的庫檔案拷貝到nfsroot/lib目錄下。
6.4 新增庫檔案和動態連結載入器
(執行命令需要依賴庫)
mkdir /nfsroot/lib
cp /usr/local/arm/4.5.1/arm-none-linux-gnueabi/lib/* /nfsroot/lib -rf
^ arm 架構的庫和載入器
6.5 新增裝置檔案
(應用執行需要)
mkdir /nfsroot/dev /nfsroot/sys /nfsroot/proc /nfsroot/tmp
mkdir /nfsroot/etc
mkdir /nfsroot/etc/init.d
6.5.1 編輯啟動指令碼:
vim /nfsroot/etc/init.d/rcS
#!/bin/sh
//掛載虛擬檔案系統:
// proc虛擬檔案系統 : ps top
// kernel執行狀況, 程序資訊;
/bin/mount -t proc none /proc
// sysfs虛擬檔案系統: mdev
// kernel中所有的支援的裝置資訊;
/bin/mount -t sysfs none /sys
// tmpfs虛擬檔案系統:
// 斷電清空資料/dev /tmp
/bin/mount -t tmpfs none /dev
// ^^^^
///dev實時描述當前kernel中支援的所有裝置的節點;
// tmpfs同上;
/bin/mount -t tmpfs none /tmp
//mdev -s : 掃描/sys目錄, 在/dev目錄下生成裝置節點;
//busybox中有mdev, x86下沒有;
/sbin/mdev -s
//支援熱插拔; 需要kernel監聽裝置的插入拔出並呼叫/sbin/mdev命令;
echo /sbin/mdev > /proc/sys/kernel/hotplug
設定指令碼的執行許可權:
chmod 777 rcS
6.5.2 編輯init程序啟動配置檔案:
vim /nfsroot/etc/inittab
系統啟動自動執行指令碼:
::sysinit:/etc/init.d/rcS (系統啟動時執行)
執行完指令碼,執行shell, 指定shell輸入輸出終端ttySAC0:
ttySAC0::respawn:/bin/sh (任何時候都執行)
注意: 不需要新增inittab;
ramdisk-u.img --> inittab --> rcS
^ 根檔案系統;