Build Linux Kernel for gem5

In this page, we will explain how to prepare Linux Kernel for gem5.

Prerequisite

Prepare kernel config files

Before starting, please download kernel_configs directory from here. This directory contains two files, config_arm and config_x86.

Download Linux Kernel source code

You can download Linux Kernel from The Linux Kernel Archives.

This table shows minimum Linux Kernel version supported by architectures and interfaces:

Architecture NVMe OCSSD [*] 1.2 OCSSD 2.0 SATA UFS
ARMv7 3.3 [1] 4.12 [4] 4.17 [5] All 4.8 [6]
ARMv8 4.4 [2] 4.12 [4] 4.17 [5] 4.4 [2] 4.8 [6]
X86 4.4 [3] 4.12 [4] 4.17 [5] 4.4 [3] Not supported
[*]OCSSD stands for Open-Channel SSD.
[1]NVMe driver is added to Linux Kernel from 3.3.
[2](1, 2) ARMv8 (aarch64) is supported from Linux Kernel 3.7 but PCI host controller used in gem5 is supported from 4.4.
[3](1, 2) X86 architecture of gem5 is quite unstable. Linux Kernel 3.4.113 ~ 4.3 does not boot.
[4](1, 2, 3) pblk driver of Open-Channel SSD is available from 4.12. rrpc is not supported by SimpleSSD.
[5](1, 2, 3) Linux Kernel supports Open-Channel SSD 2.0 from 4.17. We recommend to use 4.18.
[6](1, 2) UFS driver that SimpleSSD uses is added to Linux Kernel from 4.8.

Download toolchain

Prepare compiler for kernel compilation.

For X86 architecture, you can just use GNU C/C++ Compiler installed on your host X86 machine. If you are using non-x86 machine, you need to prepare x86 cross-compiler for your machine.

For ARM architecture, you need to download ARM cross-compiler. We recommend to use Linaro Toolchain. Download arm-linux-gnueabihf for ARMv7, aarch64-linux-gnu for ARMv8.

Install toolchain and properly set PATH environment variable.

Download dependencies

Install utilities and libraries used by Linux Kernel.

# For Debian based Linux
apt install libcurses-dev bc libssl-dev

# For Red Hat based Linux
yum install ncurses-devel bc openssl-devel

Build Linux Kernel

Extract downloaded Linux Kernel archive and cd to extracted directory.

Set ARCH and CROSS_COMPILE correctly using following table:

Variable ARMv7 ARMv8 X86
ARCH arm arm64 x86 or <Empty>
CROSS_COMPILE arm-linux-gnueabihf- aarch64-linux-gnu- <Empty>

Create default kernel configuration file:

ARCH="<arch to build>" CROSS_COMPILE="<prefix of compiler>" make defconfig

Override created .config file with provided sample configuration file.

# For ARMv7 and ARMv8
cp -f config_arm .config

# For X86
cp -f config_x86 .config

Open kernel configuration page at least once. This will fix undefined configuration entitles in .config file. You can also change configuration here.

ARCH="<arch to build>" CROSS_COMPILE="<prefix of compiler>" make menuconfig

Build Linux Kernel image:

ARCH="<arch to build>" CROSS_COMPILE="<prefix of compiler>" make vmlinux -j 8

After build, copy vmlinux image to $M5_PATH/binaries directory.

cp vmlinux $M5_PATH/binaries/my_new_kernel_image