1. 程式人生 > >Exynos4412從SD卡啟動的簡單網絡文件系統制作

Exynos4412從SD卡啟動的簡單網絡文件系統制作

x86 -m oba 大於等於 mpi 使用 trustzone 之前 ror

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  

安裝步驟:

  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文件夾
  2. 在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  
  2. 註銷用戶,重新登錄用戶後生效
    或者:

    # source /root/.bash_profile  
    // 使配置文件生效
  3. 檢查交叉編譯環境是否安裝成功:

# 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卡啟動的簡單網絡文件系統制作