Try   HackMD

安裝arm-2013.11-33-arm-none-linux-gnueabi toolchain 與 小的測試 rootfs, init 給 QEMU

Author: WhoAmI
Date: 20220726
E-mail: kccddb@gmail.com
Copyright: CC BY-NC-SA

STEP 1. 安裝 toolchain 是開始

注意我不用 GUI 介面, 因為這是最容易遠端使用
用 putty 連進 Ubuntu
警告 若是出現 & gt ; 怪符號 那個是 IO 轉向的 '大於' > 的數學符號, 打不出來
我是一邊作一邊貼, 怪符號請見諒

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-cfilt 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/SourceryCodeBenchLiteforARMGNULinux/bin:/home/laikc/CodeSourcery/SourceryG++Lite/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gameslaikc@laikcvirtualmachine: /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-tablesfno-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("<%d>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 > rootfs
993 blocks

使用 Sourcery G++ Lite 2011.03-42 編譯 Linux Kernel for QEMU ARM Version

執行 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 © 1996 okir@monad.swb.de).
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
ROMFS MTD © 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 執行結果