Buildroot and QEMU – the quickest recipe for your own Linux
I will show the quickest way of running your own-built Linux system in QEMU emulator. Did I say quickest? Let’s start then:
$ git clone git://git.buildroot.net/buildroot $ cd buildroot/ $ make qemu_arm_versatile_defconfig
Where qemu_arm_versatile_defconfig is file & defconfig name from buildroot/configs directory. Next:
$ make menuconfig
And menu similar to Linux kernel menuconfig shows up. Since we preconfigured it with the defconfig file, there is almost nothing to change here. Be sure to have all tools from Build options —> Commands menu installed in your host system.
In Build options check Enable compiler cache which will save compiler output files and make consequent compilations faster. It is not necessary though.
Now type this and get some coffee:
$ make
We have now the time to chat a bit. So, what we have just done is we run a massive process of downloading core packages and compiling them into toolchain, kernel and root filesystem that will became our own, small Linux OS. Ever heard that making Linux for embedded devices is hard? Well, it is. But we have taken three huge shortcuts.
First, by using Buildroot which is a big set of Makefiles that configures and compiles GCC, C library and whole OS ecosystem (BusyBox). What it produces in the end are the Linux kernel and the image of root filesystem.
Second shortcut is configuring Buildroot with qemu_arm_versatile_defconfig. There is nothing to change within the kernel thanks to this. This configuration file along with buildroot/board/qemu/arm-versatile/linux-4.9.config tells Buildroot to set kernel configuration to suit ARM Versatile boards template. This is one of the development platforms supported both by Linux and QEMU out of the box.
The last one is the use of QEMU. Because of that, we do not have to configure any bootloader (like U-Boot for instance). All we need to do is to run one command right after the compilation ends:
$ qemu-system-arm -M versatilepb -kernel output/images/zImage -dtb output/images/versatile-pb.dtb -drive file=output/images/rootfs.ext2,if=scsi -append "root=/dev/sda console=ttyAMA0,115200" -nographic
This was inspired by buildroot/board/qemu/arm-versatile/readme.txt.
And there it is!
pulseaudio: set_sink_input_volume() failed pulseaudio: Reason: Invalid argument pulseaudio: set_sink_input_mute() failed pulseaudio: Reason: Invalid argument vpb_sic_write: Bad register offset 0x2c Booting Linux on physical CPU 0x0 Linux version 4.9.6 (pillot@pillot) (gcc version 5.4.0 (Buildroot 2017.05-rc2-00013-g4d1c2c82e) ) #1 Sat May 20 00:42:18 CEST 2017 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177 CPU: VIVT data cache, VIVT instruction cache OF: fdt:Machine model: ARM Versatile PB Memory policy: Data cache writeback Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 Kernel command line: root=/dev/sda console=ttyAMA0,115200 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: 125088K/131072K available (3390K kernel code, 131K rwdata, 756K rodata, 132K init, 207K bss, 5984K reserved, 0K cma-reserved) Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xfff00000 (3072 kB) vmalloc : 0xc8800000 - 0xff800000 ( 880 MB) lowmem : 0xc0000000 - 0xc8000000 ( 128 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .text : 0xc0008000 - 0xc0357e80 (3392 kB) .init : 0xc042f000 - 0xc0450000 ( 132 kB) .data : 0xc0450000 - 0xc0470de0 ( 132 kB) .bss : 0xc0470de0 - 0xc04a49f8 ( 208 kB) SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 NR_IRQS:16 nr_irqs:16 16 VIC @c8800000: id 0x00041190, vendor 0x41 FPGA IRQ chip 0 "intc" @ c8802000, 20 irqs, parent IRQ: 47 clocksource: arm,sp804: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275 ns sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 2147483647500ns Failed to initialize '/amba/timer@101e3000': -22 sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns Console: colour dummy device 80x30 Calibrating delay loop... 464.48 BogoMIPS (lpj=2322432) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) CPU: Testing write buffer coherency: ok Setting up static identity map for 0x8400 - 0x8458 devtmpfs: initialized clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations OF: amba_device_add() failed (-19) for /amba/smc@10100000 OF: amba_device_add() failed (-19) for /amba/mpmc@10110000 OF: amba_device_add() failed (-19) for /amba/sctl@101e0000 OF: amba_device_add() failed (-19) for /amba/watchdog@101e1000 OF: amba_device_add() failed (-19) for /amba/sci@101f0000 OF: amba_device_add() failed (-19) for /amba/ssp@101f4000 OF: amba_device_add() failed (-19) for /amba/fpga/sci@a000 Serial: AMBA PL011 UART driver 101f1000.uart: ttyAMA0 at MMIO 0x101f1000 (irq = 28, base_baud = 0) is a PL011 rev1 console [ttyAMA0] enabled 101f2000.uart: ttyAMA1 at MMIO 0x101f2000 (irq = 29, base_baud = 0) is a PL011 rev1 101f3000.uart: ttyAMA2 at MMIO 0x101f3000 (irq = 30, base_baud = 0) is a PL011 rev1 uart-pl011 10009000.uart: aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable. 10009000.uart: ttyAMA3 at MMIO 0x10009000 (irq = 54, base_baud = 0) is a PL011 rev1 vgaarb: loaded SCSI subsystem initialized clocksource: Switched to clocksource arm,sp804 NET: Registered protocol family 2 TCP established hash table entries: 1024 (order: 0, 4096 bytes) TCP bind hash table entries: 1024 (order: 0, 4096 bytes) TCP: Hash tables configured (established 1024 bind 1024) UDP hash table entries: 256 (order: 0, 4096 bytes) UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) NET: Registered protocol family 1 futex hash table entries: 256 (order: -1, 3072 bytes) workingset: timestamp_bits=30 max_order=15 bucket_order=0 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) OF: PCI: host bridge /amba/pci-controller@10001000 ranges: OF: PCI: IO 0x43000000..0x4300ffff -> 0x00000000 OF: PCI: MEM 0x50000000..0x5fffffff -> 0x50000000 OF: PCI: MEM 0x60000000..0x6fffffff -> 0x60000000 versatile-pci 10001000.pci-controller: PCI core found (slot 11) versatile-pci 10001000.pci-controller: PCI host bridge to bus 0000:00 pci_bus 0000:00: root bus resource [bus 00-ff] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] pci_bus 0000:00: root bus resource [mem 0x50000000-0x5fffffff] pci_bus 0000:00: root bus resource [mem 0x60000000-0x6fffffff pref] PCI: bus0: Fast back to back transfers disabled pci 0000:00:0c.0: BAR 2: assigned [mem 0x50000000-0x50001fff] pci 0000:00:0c.0: BAR 1: assigned [mem 0x50002000-0x500023ff] pci 0000:00:0c.0: BAR 0: assigned [io 0x1000-0x10ff] clcd-pl11x dev:20: PL110 designer 41 rev0 at 0x10120000 clcd-pl11x dev:20: Versatile hardware, VGA display Console: switching to colour frame buffer device 80x30 sym53c8xx 0000:00:0c.0: enabling device (0100 -> 0103) sym0: <895a> rev 0x0 at pci 0000:00:0c.0 irq 66 sym0: No NVRAM, ID 7, Fast-40, LVD, parity checking sym0: SCSI BUS has been reset. scsi host0: sym-2.2.3 random: fast init done scsi 0:0:0:0: Direct-Access QEMU QEMU HARDDISK 2.5+ PQ: 0 ANSI: 5 scsi target0:0:0: tagged command queuing enabled, command queue depth 16. scsi target0:0:0: Beginning Domain Validation scsi target0:0:0: Domain Validation skipping write tests scsi target0:0:0: Ending Domain Validation scsi 0:0:2:0: CD-ROM QEMU QEMU CD-ROM 2.5+ PQ: 0 ANSI: 5 scsi target0:0:2: tagged command queuing enabled, command queue depth 16. scsi target0:0:2: Beginning Domain Validation scsi target0:0:2: Domain Validation skipping write tests scsi target0:0:2: Ending Domain Validation libphy: Fixed MDIO Bus: probed sd 0:0:0:0: [sda] 122880 512-byte logical blocks: (62.9 MB/60.0 MiB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA mousedev: PS/2 mouse device common for all mice versatile reboot driver registered NET: Registered protocol family 10 sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver NET: Registered protocol family 17 sd 0:0:0:0: [sda] Attached SCSI disk input: AT Raw Set 2 keyboard as /devices/platform/amba/amba:fpga/10006000.kmi/serio0/input/input0 input: ImExPS/2 Generic Explorer Mouse as /devices/platform/amba/amba:fpga/10007000.kmi/serio1/input/input2 EXT4-fs (sda): couldn't mount as ext3 due to feature incompatibilities EXT4-fs (sda): mounting ext2 file system using the ext4 subsystem EXT4-fs (sda): mounted filesystem without journal. Opts: (null) VFS: Mounted root (ext2 filesystem) readonly on device 8:0. devtmpfs: mounted Freeing unused kernel memory: 132K (c042f000 - c0450000) This architecture does not have kernel memory protection. EXT4-fs (sda): warning: mounting unchecked fs, running e2fsck is recommended EXT4-fs (sda): re-mounted. Opts: block_validity,barrier,user_xattr,errors=remount-ro Starting logging: OK Initializing random number generator... done. Starting network: Waiting for interface eth0 to appear............... timeout! run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1 FAIL Welcome to Buildroot buildroot login: root # cat /proc/cpuinfo processor : 0 model name : ARM926EJ-S rev 5 (v5l) BogoMIPS : 464.48 Features : swp half thumb fastmult edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Hardware : ARM-Versatile (Device Tree Support) Revision : 0000 Serial : 0000000000000000 #
As in every shortcut there is not much to understand here. Please go further: http://buildroot.uclibc.org/downloads/manual/manual.html.
13. September 2013 by resset
Categories: Software |
Tags: ARM, Buildroot, BusyBox, embedded, GCC, kernel, Linux, QEMU, toolchain, U-Boot |
6 comments
Pingback: arm64(aarch64)のLinuxカーネルをQEMU上でgdbデバッグする | IT技術情報局
Pingback: Fundamentals of Linux : II | Technofusion