1. 程式人生 > >Tiny4412 ARM開發環境搭建—NFS網路根檔案系統製作

Tiny4412 ARM開發環境搭建—NFS網路根檔案系統製作

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資料夾
  1. 在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  
  1. 修改環境變數:
# vim /root/.bash_profile   
// 在檔案末尾新增:  
PATH=/usr/local/arm/4.5.1/bin/:$PATH
export PATH
  1. 登出使用者,重新登入使用者後生效
    或者:
# source /root/.bash_profile  
// 使配置檔案生效
  1. 檢查交叉編譯環境是否安裝成功:
# 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
        ^ 根檔案系統;