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了。
如何離開Qemu,基本上是利用 ctrl+a-x。
- Press ctrl+a-x,exit Qemu
- Press ctrl+a-c, witch from Qemu
$ 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】
原作者好像還沒動工。
- 在這邊先把strace放進去試看看。最後用file跑一下知道是給arm平台的。
$wget http://ncu.dl.sourceforge.net/project/strace/strace/4.5.19/strace-4.5.19.tar.bz2
$…
$CC=arm-linux-uclibc-gcc ./configure --host=arm-linux-uclibc --prefix=$(pwd)
$make
$arm-linux-uclibc-strip strace
$file strace
strace: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped - 再把Unionfs放上去看看
$wget http://download.filesystems.org/unionfs/unionfs-2.x/unionfs-2.5.3_for_2.6.31.diff.gz
$(tbd)
【Lab5 OS debugging】
- gdb-server
配合目前的gcc 加上--disable-werror,不過我猜或許只需用ubuntu上的
$../configure --target=arm-linux-uclibc --disable-werror --prefix=$(pwd) - gdb-target
最後多加個strip
$arm-linux-uclibc-strip gdbserver
$file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped
(tbd)
【後記】
- 以上整個幾乎就是一個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)
- 思考:如何融入wiki/trac