標籤:linux 嵌入式系統 交叉編譯 檔案系統 kernel
實驗一 交叉工具鏈的安裝
【實驗目的】
瞭解交叉工具鏈的編譯過程及其使用。
說明:在實驗中命令列提示符 為“$”表示在主機上運行,“#”表示在目標板上運行
【實驗環境】
1、 ubuntu 12.04發行版
2、 FS4412平台
【實驗步驟】
1、 如果要自己編譯工具鏈,從以下連結下載源碼
crosstools-ng
http://ymorin.is-a-geek.org/download/crosstool-ng/
同時對每一個版本都有相應的補丁我們盡量把這些補丁打上,這些補丁的是
http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/
在這裡我們已經提前給大家準備好了,大家進入到我們的tools檔案夾中.
把該檔案夾移動到我們的Ubuntu系統中,然後執行。
$ cd tools
$ sudodpkg -i *.deb
2、 解壓工具鏈壓縮包
$ cd ~
$ mkdir toolchain
$ cd toolchain
將第一天/工具/gcc-4.6.4.tar.xz拷貝到toolchain目錄下並解壓
$ tar xvf gcc-4.6.4.tar.xz
3、 環境變數的添加
修改檔案/etc/bash.bashrc添加如下內容
export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin
重啟設定檔
$ source /etc/bash.bashrc
4、 工具鏈的測試
$ arm-none-linux-gnueabi-gcc –v
Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/david/Exynos4412/toolchain/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper
Target: arm-arm1176jzfssf-linux-gnueabi
Configured with: /work/builddir/src/gcc-4.6.4/configure--build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu--target=arm-arm1176jzfssf-linux-gnueabi--prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4--with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s--with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp--with-pkgversion=‘crosstool-NG hg+default-2685dfa9de14 - tc0002‘--disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap--disable-libgomp --disable-libssp --disable-libquadmath--disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-host-libstdcxx=‘-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm‘--enable-threads=posix --enable-target-optspace --without-long-double-128--disable-nls --disable-multilib--with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-c99 --enable-long-long
Thread model: posix
gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 -tc0002)
這樣我們的交叉工具鏈就安裝好了
實驗二 u-boot的燒寫及使用
【實驗目的】
瞭解u-boot的常用命令和linux核心的引導。
【實驗環境】
1、 ubuntu 12.04發行版
2、 u-boot-2010.03
3、 FS4412平台
4、 交叉編譯器 arm-none-linux-gnueabi-gcc
【實驗步驟】
1、 SD啟動盤製作
a) 將第一天/工具/ sd_fusing拷貝到Linux下
b) 將SD卡插入電腦並識別
c) 進入sdfuse_d執行如下操作
$ sudo ./mkuboot.sh /dev/sdb
d) 在SD卡中建立目錄sdupdate並把第一天/鏡像中的u-boot-fs4412.bin拷貝到這個目錄下
2、 u-boot的燒寫
a) 串連串口和板子,運行串口通訊程式(putty第一天工具中)
選擇右上方的”Serial”,然後點擊左下角的”Serial”
按照自己的主機的情況選擇COM口其他必須一直,然後點擊open開啟串口
b) 關閉開發板電源,將撥碼開關SW1調至(1000)(SD啟動模式)後開啟電源
c) 將剛才做好的SD啟動盤插入SD卡插槽
d) 重新開啟開發板能夠看到如下介面
在倒計時時按任意鍵
e) 燒寫
在終端上執行
sdfuse flashall
等待終端無輸出是表示燒寫結束
f) 關閉開發板電源,將撥碼開關SW1調至0110(EMMC啟動模式)後開啟電源可以看到如下介面表示燒寫成功
在倒計時時按任意鍵
3、 通過網路載入核心和檔案系統
a) 將 第一天/鏡像檔案/uImage拷貝到ubuntu的/tftpboot下
b) 將 第一天/鏡像檔案/rootfs.tar.xz拷貝到ubuntu的/source下並解壓
c) 將 第一天/鏡像檔案/exynos4412-fs4412.dtb拷貝到ubuntu的/tftpboot下
d) 修改虛擬機器nfs設定檔/etc/exports,添加如下內容並重啟nfs服務
/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)
e) 重新驅動nfs服務
$ sudo /etc/init.d/nfs-kernel-server restart
f) 設定啟動參數
# setenv serverip 192.168.9.120
# setenv ipaddr 192.168.9.233
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
#setenv bootargs root=/dev/nfsnfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.233
# saveenv
注意:192.168.9.120對應Ubuntu的ip
192.168.9.233 對應板子的ip
這兩個ip應該根據自己的實際情況適當修改
g) 啟動開發板看到如下現象表示成功通過網路掛載:
這是可以輸入一些Linux的命令測試
4、 從EMMC載入核心和檔案系統
a) 拷貝第一天/鏡像檔案/ramdisk.img拷貝到虛擬機器/tftpboot目錄下
b) 燒寫核心鏡像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000
c) 燒寫裝置樹檔案到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000
d) 燒寫檔案系統鏡像到EMMC上
# tftp 41000000 ramdisk.img
# movi write rootfs 41000000 300000
e) 設定啟動參數
# setenv bootcmd movi read kernel 41000000\;movi read dtb42000000\;movi read rootfs 43000000 300000\;bootm 41000000 43000000 42000000
# saveenv
f) 重新啟動開發板,u-boot自動載入、執行核心
5、 其他命令練習
6、 交叉編譯和交叉調試
a) 將u-boot啟動參數修改為網路啟動
# setenv serverip 192.168.9.120
# setenv ipaddr 192.168.9.233
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
#setenv bootargs root=/dev/nfsnfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.9.233
# saveenv
注意:192.168.9.120對應Ubuntu的ip
192.168.9.233 對應板子的ip
這兩個ip應該根據自己的實際情況適當修改
b) 編輯程式源碼myapp.c(自己寫一個簡單的c程式)
c) 交叉編譯後複製到/source/rootfs (編譯時間添加選項-g)
$arm-none-linux-gnueabi-gcc myapp.c –o myapp –g
$ cpmyapp /source/rootfs
d) 運行我們的myapp程式,觀察輸出結果
$./myapp
基於FS4412平台的Linux系統移植