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