# 安裝arm-2013.11-33-arm-none-linux-gnueabi toolchain 與 小的測試 rootfs, init 給 QEMU <style> .blue { color: blue; } .bgblue { color: blue; font-size: 24px; } .red { color: red; font-size: 24px; } h1 {text-align: center;} </style> Author: WhoAmI Date: 20220726 E-mail: kccddb@gmail.com Copyright: CC BY-NC-SA **STEP 1. 安裝 toolchain 是開始** 注意我不用 GUI 介面, 因為這是最容易遠端使用 用 putty 連進 Ubuntu 警告 若是出現 &amp; gt ; 怪符號 那個是 IO 轉向的 '大於' &gt; 的數學符號, 打不出來 我是一邊作一邊貼, 怪符號請見諒 init 的程式可以自己寫, 不一定要用現成的~~請看後面 DIY 學生會不會寫自己的 init ? 安裝 TOOL-CHAIN 依 Embedded System CPU 特性選擇 安裝arm-2013.11-33-arm-none-linux-gnueabi toolchain (歷史原因: 為了配合 QEMU) //tool-chain 需要依您的 SoC 選擇, 不同的提供者有不同選項, 因此畫面不是唯一, 這裏是用 Sourcery CodeBench Lite 現在也許您可選擇: **// https://buildroot.org/ 有很多不同toolchain // https://developer.arm.com/open-source/gnu-toolchain/gnu-rm ** --- laikc@laikc-virtual-machine:~/arm$ sudo ./arm-2013.11-33-arm-none-linux-gnueabi.bin -console Extracting installer ... Starting installer ... Welcome to the Sourcery CodeBench Lite for ARM GNU/Linux installation wizard. This wizard will guide you through the installation process. PRESS TO CONTINUE. ................................................. Where would you like to install? Install Folder: /root/MentorGraphics/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux PRESS OR TYPE NEW VALUE. /opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux Where would you like to install? Install Folder: /root/MentorGraphics/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux **** 我要換路徑**** PRESS OR TYPE NEW VALUE. /opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux Where would you like to install? Install Folder: /opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux PRESS OR TYPE NEW VALUE. The following components will be installed: 1. [*]JRE - 1.7.0 2. [*]Sourcery CodeBench Toolchain for ARM GNU/Linux - 2013.11.0.33 PRESS TO CONTINUE OR THE NUMBER OF THE OPTION TO CHANGE. 一堆版權宣告 .......................................................................................... Proceed with installation? PRESS TO USE DEFAULT (Yes) OR TYPE [Y/N]. Installing...................................................................... laikc@laikc-virtual-machine:~/arm$ ls /opt Sourcery_CodeBench_Lite_for_ARM_GNU_Linux laikc@laikc-virtual-machine:~/arm$ laikc@laikc-virtual-machine:~/arm$ ls /opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-gcc-ranlib arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-cs arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-cs-daemon arm-none-linux-gnueabi-objdump arm-none-linux-gnueabi-elfedit arm-none-linux-gnueabi-ranlib arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-readelf arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-size arm-none-linux-gnueabi-gcc-4.8.1 arm-none-linux-gnueabi-strings arm-none-linux-gnueabi-gcc-ar arm-none-linux-gnueabi-strip arm-none-linux-gnueabi-gcc-nm cache laikc@laikc-virtual-machine:~/arm$ laikc@laikc-virtual-machine:~/arm$ export PATH=/opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin:$PATH laikc@laikc-virtual-machine:~/arm$ echo $PATH /opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin:/home/laikc/CodeSourcery/Sourcery_G++_Lite/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games laikc@laikc-virtual-machine:~/arm$ --- 看一下arm-none-linux-gnueabi-gcc 資訊 (提醒: 很多 CPU 還有很多 優化選擇, 這裏因太多就不提了) laikc@laikc-virtual-machine:~/arm$ arm-none-linux-gnueabi-gcc -v Using built-in specs. COLLECT_GCC=arm-none-linux-gnueabi-gcc COLLECT_LTO_WRAPPER=/opt/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../libexec/gcc/arm-none-linux-gnueabi/4.8.1/lto-wrapper Target: arm-none-linux-gnueabi Configured with: /scratch/jroelofs/builds/fallrelease/src/gcc-4.8-2013.11/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2013 -D__CS_SOURCERYGXX_MIN__=11 -D__CS_SOURCERYGXX_REV__=33' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2013.11-33' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/jroelofs/builds/fallrelease/install/opt/codesourcery/arm-none-linux-gnueabi/libc --with-gmp=/scratch/jroelofs/builds/fallrelease/obj/pkg-2013.11-33-arm-none-linux-gnueabi/arm-2013.11-33-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/jroelofs/builds/fallrelease/obj/pkg-2013.11-33-arm-none-linux-gnueabi/arm-2013.11-33-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/jroelofs/builds/fallrelease/obj/pkg-2013.11-33-arm-none-linux-gnueabi/arm-2013.11-33-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-isl=/scratch/jroelofs/builds/fallrelease/obj/pkg-2013.11-33-arm-none-linux-gnueabi/arm-2013.11-33-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-cloog=/scratch/jroelofs/builds/fallrelease/obj/pkg-2013.11-33-arm-none-linux-gnueabi/arm-2013.11-33-arm-none-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libssp --enable-poison-system-directories --with-build-time-tools=/scratch/jroelofs/builds/fallrelease/install/opt/codesourcery/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/jroelofs/builds/fallrelease/install/opt/codesourcery/arm-none-linux-gnueabi/bin SED=sed Thread model: posix gcc version 4.8.1 (Sourcery CodeBench Lite 2013.11-33) laikc@laikc-virtual-machine:~/arm$ **STEP 2. 準備 init 程式 (DIY)** 寫一簡單程式 hello.c 當 init ....真正還是要用 busybox 做 #include void main() { int i=0; do{ printf("&lt;%d&gt;Hello World! Linux Kernel\n",i); sleep(2); i++; }while(1); } 編譯 laikc@laikc-virtual-machine:~/arm$ arm-none-linux-gnueabi-gcc -static hello.c -o hello laikc@laikc-virtual-machine:~/arm$ arm-none-linux-gnueabi-strip hello laikc@laikc-virtual-machine:~/arm$ **STEP 3. 製作 rootfs** laikc@laikc-virtual-machine:~/arm$ echo hello | cpio -o --format=newc &gt; rootfs 993 blocks [使用 Sourcery G++ Lite 2011.03-42 編譯 Linux Kernel for QEMU ARM Version](https://hackmd.io/@pingulinux/QEMUARM) 執行 QEMU 與自己的 hello, 注意沒有GUI, console=ttyAMA0 -nographic /home/laikc/arm/linux-2.6.33/arch/arm/boot/zImage 是我重新編的 kernel , -machine versatileab **STEP 5. 測試 qemu 與 init** laikc@laikc-virtual-machine:~/arm$ /usr/local/bin/qemu-system-arm -machine versatileab -kernel /home/laikc/arm/linux-2.6.33/arch/arm/boot/zImage -nographic -initrd /home/laikc/arm/rootfs -append "root=/dev/ram rdinit=/hello console=ttyAMA0" audio: Could not init `oss' audio driver Uncompressing Linux... done, booting the kernel. Linux version 2.6.33 (laikc@laikc-virtual-machine) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42) ) #1 Sat Jun 7 14:19:01 CST 2014 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177 CPU: VIVT data cache, VIVT instruction cache Machine: ARM-Versatile AB Memory policy: ECC disabled, Data cache writeback Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 Kernel command line: root=/dev/ram rdinit=/hello console=ttyAMA0 PID hash table entries: 512 (order: -1, 2048 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Memory: 128MB = 128MB total Memory: 126292KB available (2572K code, 219K data, 100K init, 0K highmem) Hierarchical RCU implementation. RCU-based detection of stalled CPUs is enabled. NR_IRQS:192 VIC @f1140000: id 0x00041190, vendor 0x41 Console: colour dummy device 80x30 Calibrating delay loop... 548.86 BogoMIPS (lpj=2744320) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok NET: Registered protocol family 16 Serial: AMBA PL011 UART driver dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 12) is a AMBA/PL011 console [ttyAMA0] enabled dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 13) is a AMBA/PL011 dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 14) is a AMBA/PL011 bio: create slab at 0 Switching to clocksource timer3 NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 4096 (order: 3, 32768 bytes) TCP bind hash table entries: 4096 (order: 2, 16384 bytes) TCP: Hash tables configured (established 4096 bind 4096) TCP reno registered UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. Trying to unpack rootfs image as initramfs... Freeing initrd memory: 496K NetWinder Floating Point Emulator V0.97 (double precision) Installing knfsd (copyright (C) 1996 okir@monad.swb.de). JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc. ROMFS MTD (C) 2007 Red Hat, Inc. msgmni has been set to 247 Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254) io scheduler noop registered io scheduler deadline registered io scheduler cfq registered (default) CLCD: Versatile hardware, VGA display Console: switching to colour frame buffer device 80x60 brd: module loaded armflash.0: Found 1 x32 devices at 0x0 in 32-bit bank Intel/Sharp Extended Query Table at 0x0031 Using buffer write method RedBoot partition parsing not available afs partition parsing not available smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre eth0: SMC91C11xFD (rev 1) at c88be000 IRQ 25 [nowait] eth0: Ethernet addr: 52:54:00:12:34:56 mice: PS/2 mouse device common for all mice TCP cubic registered NET: Registered protocol family 17 VFP support v0.3: not present Freeing init memory: 100K Hello World! Linux Kernel input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0 input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1 Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel Hello World! Linux Kernel qemu: terminating on signal 15 from pid 19880 laikc@laikc-virtual-machine:~/arm$ Hello World! Linux Kernel 就是 init 執行結果 ![](https://i.imgur.com/h97VeoW.gif)