Exynos4412從SD卡啟動的簡單網絡文件系統制作
Exynos4412從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、程序文件之前需要安裝兼容開發板的交叉編譯工具
參考Exynos4412交叉編譯環境搭建
檢測系統是否已經安裝有交叉編譯環境:
# arm-linux-gcc -v
bash: arm-linux-gcc: command not found
安裝步驟:
找到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串口工具安裝及配置
參考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
^ 根文件系統;
Exynos4412從SD卡啟動的簡單網絡文件系統制作