This tutorial is an updated version of this old post, with newer software and less obsolete emulated hardware. - Every year the market produces tons of new products that run on ARM cores, and are able to run operating systems such as Linux. While most of these products are quite expensive (think about smartphones, development kits or evaluation boards) it’s possible to explore the world of Linux on ARM freely, thanks to software emulators like QEMU.
I am going to show how to compile the kernel and emulate the boot. To simplify things, the boot will not include a complete filesystem but uses a minimal ramdisk to show the kernel executing just one program.
I chose to emulate the Versatile Express product because it’s well supported both by the mainline Linux kernel and by mainline QEMU. Moreover, this hardware platform runs on the Cortex-A9 core, which is an ARM CPU that is included in many smartphones today.
In order to follow the same steps that I did, you need some tools.
First of all, anything I do is performed on a Linux machine, specifically a Debian testing distribution, in a bash shell.
To manage the kernel compilation, GNU make should be installed (it is usually in build-essential package)
To compile the kernel for ARM architecture, a cross-compiler must be installed. The difference between a traditional compiler and a cross-compiler is that the traditional compiler runs on an architecture (for example x86_64) and produces binaries for the same architecture. A cross-compiler produces binaries for a different architecture (in our case ARMv7). Depending on your distribution and what works for your setup, you can choose from different toolchains:
- Shenzhen Xunlong Software & Canonical Launch Orange Pi App Store for Ubuntu Snaps
- Microsoft's .NET Core slowly marches onto Raspberry Pi 3
- Mainline Linux on 64-bit ARM Amlogic SoCs, and TV Boxes such as Wetek Hub / Player 2, NEXBOX A1 / A95X, etc…
- COM runs Linux on tiny, power-sipping, 64-bit Cortex-A53 SoC
- GCC Tackling Support For ARMv8-M Security Extensions
- Ubuntu 17.04 "Zesty Zapus" Is Open for Development, GCC Linaro Used for ARM Port