Running U-Boot & Linux Kernel in QEMU

Donotalo
21.5K views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content

Pre-requisites

The CROSS_COMPILE environment variable needs to be defined to the prefix of the RISC-V gcc toolchain name that's added to the path. U-Boot build system will use this variable to correctly indentify the toolchain needed.

The script below will append the line at the end of tech.io-env.sh and make it available. Execute the following from the root working directory:

echo "export CROSS_COMPILE=riscv64-linux-" >> tech.io-env.sh
source tech.io-env.sh

Build U-Boot

Download Source Code

This tutorial will use U-Boot v2023.07.02. From the root working directory, run the following in the terminal:

# Download U-Boot source
git clone https://source.denx.de/u-boot/u-boot.git

# Checkout required version
cd u-boot
git checkout v2023.07.02

Board Configuration Files

U-Boot needs to be built for the hardware on which it will run. U-Boot needs to know what's available in the hardware side (device tree) and how to use them (drivers). Each hardware configuration is different. U-Boot source tree has configuration file specific to each of the hardware that U-Boot supports. These files are also referred as board configuration file. Support for additional hardware can be made by creating separate board configuration file.

Find Architecture Specific Configuration Files

This part isn't mandatory if the board configuration file is known.

U-Boot stores board specific configuration files in the configs directory. Let's list available configuration files for RISC-V:

ls configs | grep riscv --color=always
  • --color=always = Make the foreground color different for search terms

This generates the following output:

openpiton_riscv64_defconfig
openpiton_riscv64_spl_defconfig
qemu-riscv32_defconfig
qemu-riscv32_smode_defconfig
qemu-riscv32_spl_defconfig
qemu-riscv64_defconfig
qemu-riscv64_smode_defconfig
qemu-riscv64_spl_defconfig

A QEMU simulated board will be chosen, with RISC-V 64 bit architecture capable of running Linux. qemu-riscv64_smode_defconfig will serve the purpose of this tutorial. The S-Mode (supervisor mode) configuration is chosen so that it can load Linux kernel.

Build

The command to build is:

# To generate .config file out of board configuration file
make qemu-riscv64_smode_defconfig

# To build U-Boot
make -j$(nproc)

Output

The U-Boot binary is located at ./u-boot.bin.

Open Source Your Knowledge: become a Contributor and help others learn. Create New Content