[Buildroot] How to Set Up Buildroot/QEMU/ARM Cross-Development Environment
Jim Thomas
jimthomasembedded at yahoo.com
Sun Feb 28 00:27:08 UTC 2010
Sat 27 Feb 2010
How to Set Up Buildroot/QEMU/ARM Cross-Development Environment
I am a Buildroot/QEMU novice.
There must be many ways to bring up a Buildroot/QEMU/ARM environment.
Here is one way that works.
Figuring this out was challenging in part because the target naming
is not consistent across the projects involved:
Buildroot: integrator926_defconfig
U-Boot: versatilepb
Linux kernel: versatile_defconfig
QEMU: versatilepb
This procedure describes how to:
- Create a new Ubuntu 9.10 VM running in VMware under Windows Vista.
- Build an ARM Linux kernel, RFS, and cross-toolchain in the Ubuntu VM.
- Boot the ARM Linux kernel using QEMU running in the Ubuntu VM.
- Mount the RFS via NFS using NFS server hosted by the Ubuntu VM.
- Cross-build hello.cpp for ARM in Ubuntu VM and execute in the QEMU VM.
- Configure DNS and NTP to set time automatically when QEMU VM boots.
- Cross-debug between Ubuntu VM x86 host and QEMU VM ARM target.
The following software versions are used:
- Windows Vista Home Premium with SP1
- SecureCRT 6.1.3 (build 423)
- VMware Player 2.5.3 build-185404
- Ubuntu Server 9.10 (JeOS, without GUI)
- QEMU 0.12.3 (23 Feb 2010)
- Buildroot 2010.02 (26 Feb 2010)
- Linux kernel 2.6.32.9 (23 Feb 2010)
This procedure begins by creating a new Ubuntu x86 VM to host the
Buildroot/QEMU environment, so residual files from previous experiments
will not be used unknowingly. This makes the procedure more repeatable.
Install Ubuntu Server 9.10 JeOS as a VMware guest under Windows:
Create a VMX file at easyvmx.com using 2.0 menu option and selecting:
- Name such as Ubuntu-Server-9.10-QEMU
- 512 MB memory
- NAT
- Intel Pro/1000 (for Windows Vista)
- 20 GB disk
Download the ZIP file from EasyVMX and expand it.
Launch VMware Player by running the file under Windows:
Ubuntu-Server-9_10-QEMU.vmx
The boot attempt should fail.
Configure VMware under Devices/CD to install using an Ubuntu ISO image:
671,686,656 ubuntu-9.10-server-i386.iso
Select VMware Player, Troubleshoot, Reset, and Ubuntu installer should appear.
Select language, then select F4 and:
Install a minimal virtual machine
Proceed with routine Ubuntu installation. Select option:
OpenSSH server
After Ubuntu installs and boots, update it to use current versions:
$ sudo apt-get update
$ sudo apt-get -u upgrade
$ sudo apt-get -u dist-upgrade
$ touch ~/.hushlogin
$ sudo reboot
Run '/sbin/ifconfig' to determine the eth0 IP address:
192.168.32.133
Run '/sbin/route -n' to determine the default gateway IP address:
192.168.32.2
Assume using SecureCRT as Windows Vista ssh client to access Ubuntu VM.
Set up SecureCRT ssh client for Ubuntu VM IP address:
Terminal Emulation: Linux
Terminal Font: Terminal
Create SecureCRT desktop icon to launch ssh connection to Ubuntu VM.
Create VMware desktop icon to launch the new Ubuntu VM.
Shut down VM, launch VM using desktop icon, connect using SecureCRT icon.
Create group for user (user was created during Ubuntu install):
$ sudo groupmod -n swdev jthomas
Install vim:
$ sudo apt-get install vim
Create file ~/.vimrc:
set shiftwidth=2
set tabstop=2
set softtabstop=2
set expandtab
:filetype on
:autocmd FileType c,cpp,cc,java,sh,python,php set cindent
:autocmd FileType sh set smartindent
set cinoptions=>2
set visualbell t_vb=
set hlsearch
syntax off
set background=dark
syntax on
Create file crtenv.sh (for SecureCRT, not used below):
export LANG=en_US
export SUPPORTED=en_US:en
Install routine packages listed below (some required, some not used below):
$ sudo apt-get -y install <package>
Packages:
gcc
g++
gdb
cgdb
ctags
htop
lsof
ltrace
strace
make
man
manpages
manpages-dev
manpages-posix
pinfo
psmisc
sysstat
tcpdump
traceroute
tree
vsftpd
wget
nmap
flex
bison
patch
gettext
libtool
texinfo
autoconf
ncurses-dev
zlib1g-dev
Create directory where Buildroot/QEMU will be built and cd into it:
/home/jthomas/arm-vm
Get and expand buildroot tarball:
$ wget http://buildroot.net/downloads/buildroot-2010.02.tar.gz
-rw-r--r-- 1 jthomas swdev 4428752 2010-02-26 08:59 buildroot-2010.02.tar.gz
$ tar xfz buildroot-2010.02.tar.gz
Enable SecureCRT session option Terminal Emulation Mapped Keys:
'Backspace sends delete'
so backspace works properly in menuconfig screens below.
Make buildroot .config file for ARM Integrator:
/home/jthomas/arm-vm/buildroot-2010.02
$ make help
$ make integrator926_defconfig
Press Enter several time to accept config defaults, then run:
$ make menuconfig
Configure during 'make menuconfig' (add to integrator926 defaults):
Target options
Generic serial port config
Serial port to run a getty on
ttyAMA0
Toolchain
Build gdb debugger for the Target
Build gdb server for the Target
Build gdb for the Host
Build/install c++ compiler and libstdc++
Package Selection for the target
lsof
ltrace
strace
Target filesystem options
tar the root filesystem
Compression method
gzip
Das U-Boot Boot Monitor
board name
versatilepb
Kernel
kernel binary format
zImage
Install packages selected in Buildroot:
/home/jthomas/arm-vm/buildroot-2010.02
$ make source
Start the build:
$ make
NOTE: There must be a better way to do the following step. Ideally,
this would be configured in the Buildroot menuconfig based on the
Buildroot target configuration 'integrator926_defconfig'.
When prompted to confirm Linux kernel config options (after ~55 minutes
building above), enter Ctrl-C to interrupt the kernel build and generate
a default .config file for the ARM Versatile target:
/home/jthomas/arm-vm/buildroot-2010.02/output/build/linux-2.6.32.9
$ make ARCH=arm help
$ make ARCH=arm versatile_defconfig
Continue the build:
/home/jthomas/arm-vm/buildroot-2010.02
$ make
Press Enter as needed to accept any remaining Linux kernel config
default options.
The build should complete successfully in ~15 minutes:
jthomas at pangaea:~/arm-vm/buildroot-2010.02/output/images$ ls -l
-rw-r--r-- 1 jthomas swdev 12754944 2010-02-27 14:05 rootfs.arm.ext2
-rw-r--r-- 1 jthomas swdev 10035200 2010-02-27 14:05 rootfs.arm.tar
-rw-r--r-- 1 jthomas swdev 4551309 2010-02-27 14:05 rootfs.arm.tar.gz
-rwxr-xr-x 1 jthomas swdev 92712 2010-02-27 14:04 u-boot-2009.11-20100227.bin
lrwxrwxrwx 1 jthomas swdev 27 2010-02-27 14:04 u-boot.bin -> u-boot-2009.11-20100227.bin
-rwxr-xr-x 1 jthomas swdev 1473076 2010-02-27 14:03 zImage
Expand RFS in new empty directory that will be exported via NFS:
/home/jthomas/arm-vm/rfs
$ sudo tar xfz ../buildroot-2010.02/output/images/rootfs.arm.tar.gz
$ ls -l
drwxr-xr-x 2 root root 4096 2010-02-27 13:58 bin
drwxr-xr-x 2 root root 4096 2010-02-27 13:49 boot
drwxr-xr-x 2 root root 4096 2010-02-27 12:49 config
drwxr-xr-x 2 root root 4096 2010-02-27 14:05 dev
drwxr-xr-x 5 root root 4096 2010-02-27 13:58 etc
drwxrwxrwx 3 root root 4096 2010-02-27 14:05 home
drwxr-xr-x 3 root root 4096 2010-02-27 13:58 lib
lrwxrwxrwx 1 root root 11 2010-02-27 14:08 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 2010-02-27 14:05 proc
drwxr-x--- 2 root root 4096 2010-02-27 14:05 root
drwxr-xr-x 2 root root 4096 2010-02-27 13:58 sbin
drwxr-xr-x 2 root root 4096 2010-02-27 12:49 sys
drwxrwxrwt 2 root root 4096 2010-02-27 12:49 tmp
drwxr-xr-x 6 root root 4096 2010-02-27 13:58 usr
drwxr-xr-x 4 root root 4096 2010-02-27 13:57 var
$ sudo du -sh
9.9M .
Install NFS server on Ubuntu VM:
$ nmap 192.168.32.133
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
$ sudo apt-get install portmap
$ sudo dpkg-reconfigure portmap
Should portmap be bound to the loopback address?
<No>
$ sudo apt-get install nfs-kernel-server
$ nmap 192.168.32.133
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
111/tcp open rpcbind
2049/tcp open nfs
Add to /etc/exports:
/home/jthomas/arm-vm/rfs *(rw,no_root_squash,no_subtree_check)
Restart portmap and NFS server:
$ sudo service portmap restart
$ sudo service nfs-kernel-server restart
$ showmount -e
Export list for pangaea:
/home/jthomas/arm-vm/rfs *
Install User Mode Linux utilities (includes tunctl):
$ sudo apt-get install uml-utilities
Install bridge utilities (Ethernet bridge):
$ sudo apt-get install bridge-utils
Get QEMU:
/home/jthomas/arm-vm
$ wget http://download.savannah.gnu.org/releases/qemu/qemu-0.12.3.tar.gz
Get ARM sample RFS for future use (not used below):
$ wget http://wiki.qemu.org/download/arm-test-0.2.tar.gz
Expand, build (~28 minutes), and install QEMU:
/home/jthomas/arm-vm
$ tar xfz qemu-0.12.3.tar.gz
/home/jthomas/arm-vm/qemu-0.12.3
$ ./configure
$ make
The Buildroot/QEMU/RFS development directories now consume ~3.5 GB:
/home/jthomas/arm-vm
$ sudo du -sh
3.5G .
Create file /home/jthomas/arm-vm/qemu-ifup.sh:
#!/bin/sh
# IP_TUN = IP address for TUN interface
# IP_QEMU = IP address for QEMU guest interface
IP_TUN=192.168.32.140
IP_QEMU=192.168.32.150
sudo /sbin/ifconfig $1 $IP_TUN
sudo bash -c 'echo 1 >/proc/sys/net/ipv4/ip_forward'
sudo route add -host $IP_QEMU dev tap0
sudo bash -c 'echo 1 >/proc/sys/net/ipv4/conf/tap0/proxy_arp'
sudo arp -Ds $IP_QEMU eth0 pub
Create file /home/jthomas/arm-vm/run-qemu.sh:
#!/bin/sh
TARGET=versatilepb
CONSOLE=ttyAMA0
# IP_QEMU = IP address for QEMU guest interface
# IP_HOST = IP address for Ubuntu host interface
IP_QEMU=192.168.32.150
IP_HOST=192.168.32.133
IP_GTWY=192.168.32.2
IP_MASK=255.255.255.0
IP_ARGS=$IP_QEMU:$IP_HOST:$IP_GTWY:$IP_MASK
SCRIPT=qemu-ifup.sh
RFS=~/arm-vm/rfs
KERNEL=~/arm-vm/buildroot-2010.02/output/images/zImage
QEMU=~/arm-vm/qemu-0.12.3/arm-softmmu/qemu-system-arm
sudo $QEMU -M $TARGET -nographic \
-net nic,vlan=0 -net tap,ifname=tap0,script=$SCRIPT \
-append "console=$CONSOLE root=/dev/nfs rw nfsroot=$IP_HOST:$RFS ip=$IP_ARGS" \
-kernel $KERNEL
Make the files executable:
$ chmod 755 qemu-ifup.sh
$ chmod 755 run-qemu.sh
Boot Linux in the QEMU virtual machine using the Linux kernel
and RFS created by Buildroot:
/home/jthomas/arm-vm
$ ./run-qemu.sh
Uncompressing Linux.................................. done, booting the kernel.
Linux version 2.6.32.9 (jthomas at pangaea) (gcc version 4.3.4 (Buildroot 2010.02) )
#1 Sat Feb 27 14:03:15 CST 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
CPU: VIVT data cache, VIVT instruction cache
Machine: ARM-Versatile PB
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyAMA0 root=/dev/nfs rw
nfsroot=192.168.32.133:/home/jthomas/arm-vm/rfs
ip=192.168.32.150:192.168.32.133:192.168.32.2:255.255.255.0
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: 126748KB available (2596K code, 227K data, 108K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:192
VIC @f1140000: id 0x00041190, vendor 0x41
Console: colour dummy device 80x30
Calibrating delay loop... 242.48 BogoMIPS (lpj=1212416)
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
fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 38) is a AMBA/PL011
bio: create slab <bio-0> 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
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Installing knfsd (copyright (C) 1996 okir at 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 anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
CLCD: unknown LCD panel ID 0x00001000, using VGA
CLCD: Versatile hardware, VGA display
Console: switching to colour frame buffer device 80x60
brd: module loaded
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico at fluxnic.net>
eth0: SMC91C11xFD (rev 1) at c8800000 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: implementor 41 architecture 1 part 10 variant 9 rev 0
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
eth0: link up
IP-Config: Complete:
device=eth0, addr=192.168.32.150, mask=255.255.255.0, gw=192.168.32.2,
host=192.168.32.150, domain=, nis-domain=(none),
bootserver=192.168.32.133, rootserver=192.168.32.133, rootpath=
Looking up port of RPC 100003/2 on 192.168.32.133
Looking up port of RPC 100005/1 on 192.168.32.133
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 108K
mount: mounting none on /dev failed: Invalid argument
mount: mounting tmpfs on /tmp failed: Invalid argument
mount: mounting configfs on /config failed: No such device
Initializing random number generator... done.
Starting network...
ip: RTNETLINK answers: File exists
Generating RSA Key...
Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh_host_key.
Your public key has been saved in /etc/ssh_host_key.pub.
The key fingerprint is:
77:2f:ee:18:31:84:2c:2a:e7:78:65:79:98:3f:e5:70
The key's randomart image is:
+--[RSA1 2048]----+
| |
| . . |
| . o . |
| . = . |
| . o * S E . |
| = o o * + . |
| . o o o . . |
| . . + . |
| ..o |
+-----------------+
Generating RSA Key...
Generating public/private rsa key pair.
Your identification has been saved in /etc/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh_host_rsa_key.pub.
The key fingerprint is:
11:aa:73:46:97:00:d2:b9:ce:65:26:a9:23:ee:8e:90
The key's randomart image is:
+--[ RSA 2048]----+
| ...o. . |
| .o o o |
| oo + |
| +o+. . |
| +o=o S |
|..o o+ |
|E. . |
|o. |
|+o |
+-----------------+
Generating DSA Key...
THIS CAN TAKE A MINUTE OR TWO DEPENDING ON YOUR PROCESSOR!
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh_host_dsa_key.pub.
The key fingerprint is:
7e:46:f5:ee:3a:2a:52:76:cf:75:26:8f:e1:28:77:05
The key's randomart image is:
+--[ DSA 1024]----+
| |
| |
| . |
| . .E |
| S . .. |
| .o.. .+ +|
| o..oo +.O |
| . .o. *.+ .|
| . ..+.+. |
+-----------------+
Starting sshd: OK
Welcome to Buildroot
buildroot login: root
# uname -a
Linux buildroot 2.6.32.9 #1 Sat Feb 27 14:03:15 CST 2010 armv5tejl unknown
# ls -l /
drwxr-xr-x 2 root root 4096 Feb 27 2010 bin
drwxr-xr-x 2 root root 4096 Feb 27 2010 boot
drwxr-xr-x 2 root root 4096 Feb 27 2010 config
drwxr-xr-x 3 root root 4096 Feb 27 2010 dev
drwxr-xr-x 5 root root 4096 Feb 27 2010 etc
drwxrwxrwx 3 root root 4096 Feb 27 2010 home
drwxr-xr-x 3 root root 4096 Feb 27 2010 lib
lrwxrwxrwx 1 root root 11 Feb 27 2010 linuxrc -> bin/busybox
dr-xr-xr-x 38 root root 0 Dec 31 17:00 proc
drwxr-x--- 2 root root 4096 Feb 27 2010 root
drwxr-xr-x 2 root root 4096 Feb 27 2010 sbin
drwxr-xr-x 12 root root 0 Dec 31 17:00 sys
drwxrwxrwt 2 root root 4096 Feb 27 2010 tmp
drwxr-xr-x 6 root root 4096 Feb 27 2010 usr
drwxr-xr-x 4 root root 4096 Feb 27 2010 var
# du -sh /
9.9M
# cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 242.48
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : ARM-Versatile PB
Revision : 0000
Serial : 0000000000000000
# ps
PID USER COMMAND
1 root init
2 root [kthreadd]
3 root [ksoftirqd/0]
4 root [watchdog/0]
5 root [events/0]
6 root [khelper]
9 root [async/mgr]
87 root [sync_supers]
89 root [bdi-default]
91 root [kblockd/0]
95 root [kseriod]
97 root [kmmcd]
113 root [rpciod/0]
122 root [khungtaskd]
123 root [kswapd0]
124 root [aio/0]
125 root [nfsiod]
268 root [mtdblockd]
278 root [kpsmoused]
303 root [flush-0:11]
329 root /usr/sbin/sshd
332 root /sbin/getty 38400 tty1
333 root /sbin/getty 38400 tty2
336 root -sh
337 root /sbin/syslogd -n
338 root /sbin/klogd -n
339 root /usr/bin/tail -f /var/log/messages
349 root ps
# halt
The system is going down NOW!
Sending SIGTERM to all processes
Sending SIGKILL to all processes
Requesting system halt
System halted.
Enter Ctrl-a-x to terminate the QEMU VM and return to the Ubuntu VM:
QEMU: Terminated
The initial QEMU VM boot above took longer than usual because the
public/private keys were generated.
Boot Linux in the QEMU virtual machine again (boots in 7 seconds):
$ ./run-qemu.sh
Uncompressing Linux.................................. done, booting the kernel.
Linux version 2.6.32.9 (jthomas at pangaea) (gcc version 4.3.4 (Buildroot 2010.02) )
#1 Sat Feb 27 14:03:15 CST 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
CPU: VIVT data cache, VIVT instruction cache
Machine: ARM-Versatile PB
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyAMA0 root=/dev/nfs rw
nfsroot=192.168.32.133:/home/jthomas/arm-vm/rfs
ip=192.168.32.150:192.168.32.133:192.168.32.2:255.255.255.0
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: 126748KB available (2596K code, 227K data, 108K init, 0K highmem)
Hierarchical RCU implementation.
NR_IRQS:192
VIC @f1140000: id 0x00041190, vendor 0x41
Console: colour dummy device 80x30
Calibrating delay loop... 228.55 BogoMIPS (lpj=1142784)
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
fpga:09: ttyAMA3 at MMIO 0x10009000 (irq = 38) is a AMBA/PL011
bio: create slab <bio-0> 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
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Installing knfsd (copyright (C) 1996 okir at 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 anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
CLCD: unknown LCD panel ID 0x00001000, using VGA
CLCD: Versatile hardware, VGA display
Console: switching to colour frame buffer device 80x60
brd: module loaded
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico at fluxnic.net>
eth0: SMC91C11xFD (rev 1) at c8800000 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: implementor 41 architecture 1 part 10 variant 9 rev 0
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
eth0: link up
IP-Config: Complete:
device=eth0, addr=192.168.32.150, mask=255.255.255.0, gw=192.168.32.2,
host=192.168.32.150, domain=, nis-domain=(none),
bootserver=192.168.32.133, rootserver=192.168.32.133, rootpath=
Looking up port of RPC 100003/2 on 192.168.32.133
Looking up port of RPC 100005/1 on 192.168.32.133
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 108K
mount: mounting none on /dev failed: Invalid argument
mkdir: cannot create directory '/dev/pts': File exists
mount: mounting tmpfs on /tmp failed: Invalid argument
mount: mounting configfs on /config failed: No such device
Initializing random number generator... done.
Starting network...
ifup: interface lo already configured
Starting sshd: OK
Welcome to Buildroot
buildroot login: root
#
Set the system date/time (required for user setup and remote login success):
# date
Wed Dec 31 17:02:42 MST 1969
# date 022715352010
Sat Feb 27 15:35:00 MST 2010
Create root password (required for remote login as root):
# passwd
Changing password for root
New password: ******
Bad password: too weak
Retype password: ******
Password for root changed by root
Add user:
# addgroup swdev
# adduser -G swdev jthomas
Changing password for jthomas
New password: ******
Bad password: too weak
Retype password: ******
Password for jthomas changed by root
# ls -al /home/jthomas/
drwxr-sr-x 2 jthomas swdev 4096 Feb 27 14:39 .
drwxrwxrwx 4 root root 4096 Feb 27 14:39 ..
Verify can log in to QEMU VM as user and root from Ubuntu VM via ssh:
$ ssh jthomas at 192.168.32.150
jthomas at 192.168.32.150's password: ******
$ id
uid=1001(jthomas) gid=7(swdev) groups=7(swdev)
$ exit
Connection to 192.168.32.150 closed.
$ ssh root at 192.168.32.150
root at 192.168.32.150's password: ******
# id
uid=0(root) gid=0(root) groups=0(root),10(wheel)
# exit
Connection to 192.168.32.150 closed.
On the Ubuntu VM host, add the Buildroot cross-toolchain to the PATH:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ export PATH=$PATH:~/arm-vm/buildroot-2010.02/output/staging/usr/bin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
/home/jthomas/arm-vm/buildroot-2010.02/output/staging/usr/bin
Verify the cross-toolchain built by Buildroot is accessible:
$ arm-linux-g++ --version
arm-linux-g++ (Buildroot 2010.02) 4.3.4
On the Ubuntu VM host, make the user directory within the RFS accessible:
/home/jthomas/arm-vm/rfs/home
$ ls -l
drwxr-sr-x 2 jthomas swdev 4096 2010-02-27 14:05 default
drwxr-sr-x 2 1001 lp 4096 2010-02-27 15:41 jthomas
$ sudo chmod 777 jthomas/
$ ls -l
drwxr-sr-x 2 jthomas swdev 4096 2010-02-27 14:05 default
drwxrwsrwx 2 1001 lp 4096 2010-02-27 15:41 jthomas
On the Ubuntu VM host, create a C++ hello world test program:
/home/jthomas/arm-vm/rfs/home/jthomas
$ cat hello.cpp
// hello.cpp
#include <iostream>
int main()
{
std::cout << "hello virtual world!\n";
}
$ arm-linux-g++ -o hello hello.cpp
$ ls -l
-rwxr-xr-x 1 jthomas lp 6848 2010-02-27 16:04 hello
-rw-r--r-- 1 jthomas lp 91 2010-02-27 16:04 hello.cpp
Verify the cross-built binary is executable from the QEMU VM ssh console:
/home/jthomas
$ ls -l
-rwxr-xr-x 1 default swdev 6848 Feb 27 15:04 hello
-rw-r--r-- 1 default swdev 91 Feb 27 15:04 hello.cpp
$ ldd hello
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x4000e000)
libm.so.0 => /lib/libm.so.0 (0x40082000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4009c000)
libc.so.0 => /lib/libc.so.0 (0x400af000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x40000000)
$ ./hello
hello virtual world!
Enter 'halt' and use Ctrl-a-x to exit the QEMU VM:
# halt
The system is going down NOW!
Sending SIGTERM to all processes
Sending SIGKILL to all processes
Requesting system halt
System halted.
QEMU: Terminated
Enable BR2_PACKAGE_NTP in Buildroot .config file under:
/home/jthomas/arm-vm/buildroot-2010.02
Change .config from:
# BR2_PACKAGE_NTP is not set
to:
BR2_PACKAGE_NTP=y
Rebuild the RFS and expand it under ~/arm-vm/rfs.
The S49ntp startup file is now present in the RFS:
/home/jthomas/arm-vm/rfs/etc/init.d
$ ls -l
-rwxr-xr-x 1 root root 408 2010-02-26 08:52 rcS
-rwxr-xr-x 1 root root 1365 2010-02-26 08:52 S20urandom
-rwxr-xr-x 1 root root 282 2010-02-26 08:52 S40network
-rwxr-xr-x 1 root root 1078 2010-02-27 16:34 S49ntp
-rwxr-xr-x 1 root root 1089 2010-02-27 13:57 S50sshd
Add /home/jthomas/arm-vm/rfs/etc/ntp.conf to the RFS:
server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 127.0.0.1
Change /home/jthomas/arm-vm/rfs/etc/default/ntpd 'NTPDATE=no'
to 'NTPDATE=yes':
# NTP Servers to use for ntpdate
NTPSERVERS="pool.ntp.org"
# Get initial time via ntpdate?
NTPDATE=yes
NTPDATE_OPTS="-t 5"
# Start the ntp daemon?
NTPD=yes
With that change, 'ntpdate' will be run at startup to get
the initial date before 'ntpd' is run to maintain accuracy.
Add to /home/jthomas/arm-vm/rfs/etc/resolv.conf in RFS:
domain localdomain
search localdomain
nameserver 192.168.32.2
The date/time is now correct after QEMU VM Linux boot:
<snip>
Getting initial time via ntp.
Starting network time protocol daemon: ntpd.
<snip>
Welcome to Buildroot
buildroot login: root
# date
Sat Feb 27 15:50:11 MST 2010
Enter 'halt' and use Ctrl-a-x to exit the QEMU VM.
Test execution of the U-Boot image built by Buildroot:
/home/jthomas/arm-vm
$ sudo qemu-0.12.3/arm-softmmu/qemu-system-arm
-M versatilepb -append "console=ttyAMA0" -nographic
-kernel buildroot-2010.02/output/images/u-boot.bin
U-Boot 2009.11 (Feb 27 2010 - 14:03:29)
DRAM: 0 kB
## Unknown FLASH on Bank 1 - Size = 0x00000000 = 0 MB
Flash: 0 kB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: SMC91111-0
VersatilePB #
VersatilePB # printenv
bootargs=root=/dev/nfs mem=128M ip=dhcp netdev=25,0,0xf1010000,0xf1010010,eth0
bootdelay=2
baudrate=38400
bootfile="/tftpboot/uImage"
stdin=serial
stdout=serial
stderr=serial
verify=n
ethact=SMC91111-0
Environment size: 202/8188 bytes
VersatilePB #
Use Ctrl-a-x to exit the QEMU VM:
QEMU: Terminated
Experimented with cross-debugging an ARM executable running on
the QEMU ARM VM, using cgdb/cross-gdb running on the Ubuntu VM.
Boot the QEMU VM using the new (second build with NTP) RFS above.
On the QEMU VM, recreate the user account as shown further above:
# addgroup swdev
# adduser -G swdev jthomas
Changing password for jthomas
New password: ******
Bad password: too weak
Retype password: ******
Password for jthomas changed by root
# chmod 777 /home/jthomas
On the Ubuntu VM, cross-compile a C++ test program using the ARM
toolchain created by Buildroot:
/home/jthomas/arm-vm/rfs/home/jthomas
$ cat hello.cpp
// hello.cpp
#include <iostream>
int main()
{
for (int i = 0; i < 10; i++)
{
std::cout << "[" << i << "] hello world\n";
}
}
$ ~/arm-vm/buildroot-2010.02/output/staging/usr/bin/arm-linux-g++ -g -o hello hello.cpp
$ ls -l
-rwxr-xr-x 1 jthomas swdev 33247 2010-02-27 17:25 hello
-rw-r--r-- 1 jthomas swdev 137 2010-02-27 17:13 hello.cpp
On the QEMU ARM VM, execute the test program using ARM gdbserver in the RFS:
/home/jthomas
$ ls -l
-rwxr-xr-x 1 default default 33247 Feb 27 16:25 hello
-rw-r--r-- 1 default default 137 Feb 27 16:13 hello.cpp
$ gdbserver 0.0.0.0:9999 ./hello
Process ./hello created; pid = 372
Listening on port 9999
NOTE: 'cgdb' is an ncurses front-end to gdb with source window
and syntax highlighting. It runs on the Ubuntu VM host, using
the cross-debugger built by Buildroot. It interoperates with
gdbserver (also built by Buildroot) running on the QEMU VM.
On the Ubuntu VM, start the ARM toolchain gdb under control of cgdb:
$ cgdb -d ~/arm-vm/buildroot-2010.02/output/staging/usr/bin/arm-linux-gdb ./hello
On the Ubuntu VM, enter in the gdb command window in cgdb:
(gdb) target remote 192.168.32.150:9999
Remote debugging using 192.168.32.150:9999
[New Thread 372]
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x400009a0 in ?? ()
(gdb) break main
Breakpoint 1 at 0x87c4: file hello.cpp, line 7.
(gdb) cont
Continuing.
Breakpoint 1, main () at hello.cpp:7
(gdb) next
(gdb)
(gdb)
(gdb)
(gdb)
(gdb)
(gdb)
On the Ubuntu VM, the cgdb source window displays single-stepping:
~|
1| // hello.cpp
2|
3| #include <iostream>
4|
5| int main()
6| {
7+> for (int i = 0; i < 10; i++)
8| {
9| std::cout << "[" << i << "] hello world\n";
10| }
11| }
~|
On the QEMU VM, the ARM executable responds to the remote gdb commands:
Remote debugging from host 192.168.32.140
[0] hello world
[1] hello world
[2] hello world
On the Ubuntu VM, entered the gdb command 'cont' (continue):
(gdb) cont
Continuing.
Program exited normally.
(gdb)
On the QEMU VM, the ARM executable responded to the remote gdb command:
[3] hello world
[4] hello world
[5] hello world
[6] hello world
[7] hello world
[8] hello world
[9] hello world
Child exited with retcode = 0
Child exited with status 0
GDBserver exiting
$
I hope these notes are helpful.
Thanks to the Buildroot/QEMU/Linux/etc. open source projects.
Jim Thomas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20100227/d521b083/attachment.html>
More information about the buildroot
mailing list