【Buildroot】Toolchain Maker(tbd)


OPENCSL - 打開嵌入式系統操作大門的開放教材(http://opencsl.openfoundry.org/Lab01_intro.rst.html)
提供豐富的資料,不過有的東西有點過期了。附記一下我測試的筆記。

【環境】
Ubuntu 9.10/gcc 4.4.1

【Lab1. install Qemu and build/verify(ch2.1)】
先參考 http://www.qemu.org/download.html,抓取最新的套件。

$apt-get install libsdl1.2debian-all libsdl1.2-dev zlib1g-dev 
$wget http://download.savannah.gnu.org/releases/qemu/qemu-0.10.6.tar.gz 
$tar zxvf qemu-0.10.6.tar.gz 
$cd qemu-0.10.6 
$./configure --cc=/usr/bin/gcc-4.4 --host-cc=/usr/bin/gcc-4.4 --target-list=arm-softmmu 
$make 
$make install 

$wget http://www.nongnu.org/qemu/arm-test-0.2.tar.gz 
$tar zxvf arm-test-0.2.tar.gz 
$cd arm-test 
$./qemu-system-arm -kernel zImage.integrator -initrd arm_root.img -nographic -append "console=ttyAMA0"
這樣Qemu就帶起來測試的kernel和file_system了。
image 
如何離開Qemu,基本上是利用 ctrl+a-x。
  • Press ctrl+a-x,exit Qemu
  • Press ctrl+a-c, witch from Qemu
【Lab1. toolchain(ch2.3)】
$ sudo apt-get install bison flex gettext patch build-essential texinfo
$ sudo apt-get install subversion
$ sudo apt-get install libncurses5-dev
$ svn co -r 21163 svn://uclibc.org/trunk/buildroot
$ cd buildroot
$ make menuconfig

可能會遇到的問題與解決方式:

  • 現象: Appear below error message 
    scripts/unifdef.c:209: error: conflicting types for ‘getline’
  • 解決方式: rename toolchain_build_arm/linux-2.6.22.10/scripts/unifdef.c/getline() to something else
    利用「arm-linux-gcc –v」或 「arm-linux-uclibc-gcc –v」 來看結果。

這次Lab的重點在於確定gcc的版本與include/lib路徑。

$build_arm/staging_dir/usr/bin/arm-linux-gcc -v
Using built-in specs.
Target: arm-linux-uclibc
Configured with: /root/buildroot/buildroot/toolchain_build_arm/gcc-4.2.1/configure --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=arm-linux-uclibc --enable-languages=c --with-sysroot=/root/buildroot/buildroot/build_arm/staging_dir --with-build-time-tools=/root/buildroot/buildroot/build_arm/staging_dir/usr/arm-linux-uclibc/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared --with-gmp=/root/buildroot/buildroot/toolchain_build_arm/gmp --with-mpfr=/root/buildroot/buildroot/toolchain_build_arm/mpfr --disable-nls --enable-threads --disable-multilib
Thread model: posix
gcc version 4.2.1

設定環境變數

$export PATH=/root/buildroot/buildroot/build_arm/staging_dir/usr/bin:$PATH 
$source ~/.bashrc

【Lab2 Kernel】

  • 第一次保險的作法基本上跟著採用 linux 2.6.18.1就可以了。
    $make -j4
  • 完成之後,確認Image
    $file linux-2.6.18.1/arch/arm/boot
    linux-2.6.18.1/arch/arm/boot/zImage: data
  • 執行
    $qemu-0.10.6/arm-softmmu/qemu-system-arm -kernel kernel/linux-2.6.18.1/arch/arm/boot/zImage -initrd arm-test/arm_root.img -nographic -append "console=ttyAMA0"
  • 驗證
    qemu login: root
    login[731]: root login  on `ttyAMA0'
    BusyBox v1.1.2 (2006.05.04-15:30+0000) Built-in shell (ash)
    Enter 'help' for a list of built-in commands.
    # uname -a
    Linux qemu 2.6.18.1 #1 Tue Jan 12 12:05:26 CST 2010 armv5tejl unknown
  • 為了unionfs,這邊嘗試編譯2.6.31
    參考 适用于QEMU的ARM虚拟机的内核最简配置
    http://hi.chinaunix.net/?uid-21635276-action-viewspace-itemid-39010
    $wget wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.gz
    $make ARCH=arm CROSS_COMPILE=arm-linux-uclibc-  allnoconfig
    $make ARCH=arm CROSS_COMPILE=arm-linux-uclibc-  menuconfig
    $make -j4 ARCH=arm CROSS_COMPILE=arm-linux-uclibc-

  • $cp arch/arm/configs/versatile_defconfig .config
  • (tbd)
  • 可能問題:
    qemu: fatal: integratorcm_read: Unimplemented offset 0x1f1018
    R00=00013770 R01=00000055 R02=ffffffff R03=101f1000
    R04=000cb4a8 R05=000d3540 R06=000d353c R07=000d3530
    R08=00000100 R09=00000000 R10=10000000 R11=000d4938
    R12=000d493c R13=000d492c R14=000133f4 R15=00010c04
    PSR=200001d3 --C- A svc32
    已經終止

【Lab3 Filesystem】

  • Busybox部分: 可以採用目前最新的 busybox-1.15.3,摘錄一下命令
    $make CROSS_COMPILE=arm-linux-uclibc- ARCH=arm
    $make install CROSS_COMPILE=arm-linux-uclibc- ARCH=arm
    $file bin/busybox
    bin/busybox: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped
  • 製作必須檔案與目錄
    $cd ./_install/
    $mkdir etc etc/init.d dev root tmp
    $cd dev
    $sudo mknod console c 5 1
    $sudo mknod null c 1 3
    $sudo mknod ttyAMA0 c 204 64
  • 承上,記的最後再補足
    /etc/inittab
    /etc/init.d/rcS
    /etc/passwd
    /ect/group
  • 把檔案放到 rom這個目錄
    (tbd)
  • nfs設定,這部分改成用genext2fs 省得麻煩,類似範例如下
    $genext2fs -b 2048 -i 1024 -d rom/ ext2fs
  • 測試
    $qemu-0.10.6/arm-softmmu/qemu-system-arm -kernel kernel/linux-2.6.18.1/arch/arm/boot/zImage -initrd ext2fs -nographic -append "console=ttyAMA0"
  • 確認
    opencsl login: root
    Jan  1 00:00:07 login[719]: root login on 'ttyAMA0'
    # uname -a
    Linux opencsl 2.6.18.1 #1 Tue Jan 12 12:05:26 CST 2010 armv5tejl GNU/Linux
  • 把kernel和file system作成一包。


【Lab4 OS porting】

原作者好像還沒動工。

【Lab5 OS debugging】

  1. gdb-server
    配合目前的gcc 加上--disable-werror,不過我猜或許只需用ubuntu上的
    $../configure --target=arm-linux-uclibc --disable-werror --prefix=$(pwd)
  2. gdb-target
    最後多加個strip
    $arm-linux-uclibc-strip gdbserver
    $file gdbserver
    gdbserver: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped

(tbd)

【後記】

  1. 以上整個幾乎就是一個BSP的製作過程了。有了這次的經驗。在下次跑案子的時候,我們可以事先規劃好BSP的整個架構,先由目錄規畫開始,來看要放那些檔案。
    BSP Installation directory
        +
        |--- Documentation(bugs/features/how-to..)
        |
        |--- Firmware(bzimage/rootfs)
        |
        |--- loader(ex.redboot...)
        |
        |--- kernel(linux kernel)
        |
        |--- apps(Userspace/verdor's driver)
        |
        |--- toolchain(buildroot)
        |
        |--- Project(.config)
  2. 思考:如何融入wiki/trac
 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com