how to step qemu for custom kernel

Hello guys, welcome back to my blog. In this article, I will discuss how to setup QEMU for the custom kernel, Linux kernel programming, step-by-step procedure to stepup QEMU on Linux, etc.

If you have any electrical, electronics, and computer science doubts, then ask questions. You can also catch me on Instagram – CS Electrical & Electronics.

Also, read:

How to Setup QEMU For The Custom Kernel

QEMU is utilized to emulate machines and several furnished instructions and needs either the KVM kernel or KQEMU modules and the host operating system to give a virtual machine environment. It is typically utilized to run Windows and DOS applications on Linux computers.

QEMU is a virtualization technology emulator that enables you to run operating systems and Linux distributions easily on your current system without the necessity to install them or burn their ISO files. It is similar to VMware or VirtualBox.

You need to have any one of these three things on your system, such as,

  • WSL
  • Vbox with Ubuntu
  • Double boot Ubuntu

Once you have this, now let’s see how to setup QEMU of the custom kernel.

Setup Clean Workspace

  • Choose a clean directory for all the work,
  • You may choose a directory like workspace/eworkspace/kworkspace/ebuildws/ews or with any sensible name under the home directory
  • Don’t use Desktop, Downloads, Documents, Music, Videos, Pictures, etc, which are meant for another purpose.
  • Avoid spaces or special symbols in path names
  • Under this workspace keep different sub directories for downloaded packages, extracted sources to build, configuration files, examples, etc.

Setup Qemu

Install Qemu, a full system emulator for the ARM target architecture.

sudo apt install qemu-system-arm
qemu-system-arm -version
qemu-system-arm -M ?
qemu-system-aarch64 -version

Rootfs

Download core-image-minimal-qemuarm.ext4 from

http://downloads.yoctoproject.org/releases/yocto/yocto-2.5/machines/qemu/qemuarm/

Rename core-image-minimal-qemuarm.ext4 as rootfs.img

Align the size of rootfs

e2fsck -f rootfs.img
resize2fs rootfs.img 16M

Toolchain

Install linaro toolchain from ubuntu package manager.

sudo apt install gcc-arm-linux-gnueabi

We’ll go for soft float for now, due rootfs compatability

Alternatively, download latest pre-built linaro toolchain from as per host architecture

From https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabi/, say v7.5.0

First Boot

Collect prebuilt zImage, vexpress-v2p-ca9.dtb.

Ensure rootfs.img is also in same location

Emulate using Qemu – sdcard approach

qemu-system-arm -M vexpress-a9 -m 1024 -serial stdio -kernel zImage -dtb vexpress-v2p-ca9.dtb -sd rootfs.img -append "console=ttyAMA0 root=/dev/mmcblk0 rw"

Emulate using Qemu – initrd approach

qemu-system-arm -M vexpress-a9 -m 1024 -serial stdio -kernel zImage -dtb vexpress-v2p-ca9.dtb -initrd rootfs.img -append "console=ttyAMA0 root=/dev/mmcblk0 rw"

Post Boot Steps

uname -r
uname -v
cat /proc/cpuinfo
free -m
mount
dmesg

Obtaining Kernel Source

Download any recent LTS version of kernel source

Let’s go with 4.14.x for now, for better compatibility with Qemu

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.202.tar.xz
tar –xvf linux-4.14.202.tar.xz

Or you can checkout kernel source from git.kernel.org, and switch to desired branch

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout tags/v4.14 –b v4.14

Let’s call extracted content (or) checked out content as KSRC

Obtain Configuration File

Locate default config available in KSRC/arch/arm/configs, we’ll refer vexpress_defconfig for Versatil Express target being used for Qemu emulation

Or collect any well tested configuration file as base config

make ARCH=arm mrproper
make ARCH=arm vexpress_defconfig
(or)
# copy custom config file as .config under KSRC

Please note that mrproper will remove built files, including the configuration. So run this only for any new build.

Customize Kernel Configuration

Run menuconfig for further customization

Resolve any host dependencies at this stage, e.g. libncurses5-dev, flex, bison etc.

make ARCH=arm menuconfig

Let’s do these minimal changes for now

General Setup -> Local Version -> "-custom“

Device Drivers -> Block Devices -> 

Enable RAM Block device support

Increase default RAM disk size to suitable limit, say 65536

Enable the block layer

Support for large (2TB+)

Customization – menuconfig

Run menuconfig for further customization

Build kernel image

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage -j <n>

Build Device Tree Binaries

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs firmware

Build dynamic modules (can skip for now)

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=<tempdir> # or mount point of target rootfs

Booting the new kernel

Collect built outcome to a temporary location

# switch to KSRC
cp $KSRC/arch/arm/boot/zImage <path-of-temp-boot-dir>
cp $KSRC/arch/arm/boot/dts/*.dtb <path-of-temp-boot-dir>

Ensure rootfs.img is also in same location

Emulate using Qemu

qemu-system-arm -M vexpress-a9 -m 1024 -serial stdio -kernel zImage -dtb vexpress-v2p-ca9.dtb -rootfs.img -append "console=ttyAMA0 root=/dev/mmcblk0 rw"

Test the Built outcome

Post Boot Checks:-

# In Target

uname –r
uname –v

# In Host

ls –lh $KSRC/arch/arm/boot/zImage
ls –lh $KSRC/vmlinux

Offline Method – cscope

sudo apt install cscope
# switch to KSRC
make cscope
cscope

This was about “”. I hope this article may help you all a lot. Thank you for reading.

Also, read:

About The Author

Share Now