文章目录
- 1. 前言
- 2. 编译过程
- 2.1 准备内核源代码
- 2.2 安装编译工具
- 2.3 配置、编译、运行
- 2.3.1 配置
- 2.3.2 编译
- 2.3.3 运行
- 3. 参考资料
1. 前言
限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。
2. 编译过程
本文基于 Ubuntu 20.04 LTS Desktop
系统进行编译。编译生成代码的目标架构
为 ARM64
,使用 QEMU
运行。
2.1 准备内核源代码
到 kernel.org 下载 Linux 6.13.2
内核:
2.2 安装编译工具
安装 clang + llvm,pahole
:
sudo apt-get update
sudo apt-get install clang-18 lld-18
sudo apt install dwarves
如果是 Ubuntu 22.04 LTS Desktop
系统下,可通过如下操作安装高版本 clang :
wget https://apt.llvm.org/llvm.sh
chmod u+x llvm.sh
sudo ./llvm.sh 18
sudo apt-get install libelf-dev
参考链接:
如何在 Ubuntu 22.04 中安装 Clang 17 或 16 | 20.04
Easy Steps To Install Clang LLVM on Ubuntu 22.04
2.3 配置、编译、运行
2.3.1 配置
首先生成默认配置:
# 指定使用 clang-18
make LLVM=-18 ARCH=arm64 O=output defconfig
然后通过命令修改配置:
make LLVM=-18 ARCH=arm64 O=output menuconfig
开启 sched_ext
配置和其依赖配置:
CONFIG_BPF=y
CONFIG_SCHED_CLASS_EXT=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_DEBUG_INFO_BTF=y
还有一些建议
但不是必须开启的配置:
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_PAHOLE_HAS_SPLIT_BTF=y
CONFIG_PAHOLE_HAS_BTF_TAG=y
其中 CONFIG_PAHOLE_HAS_SPLIT_BTF
和 CONFIG_PAHOLE_HAS_BTF_TAG
都对工具 pahole
的版本有要求,Ubuntu 20.04
安装的 pahole
的版本为 1.21
,无法支持 CONFIG_PAHOLE_HAS_BTF_TAG
特性,但不影响 sched_ext
的使用。
另外还可以开启一些调试配置
:
# useful debug features for sched_ext
CONFIG_DEBUG_INFO=y
CONFIG_SCHED_DEBUG=y
CONFIG_DEBUG_INFO_DWARF5=y
CONFIG_DEBUG_INFO_BTF_MODULES=y
2.3.2 编译
make LLVM=-18 ARCH=arm64 O=output -j8
make LLVM=-18 ARCH=arm64 O=output -j8 modules
编译后生成的 vmlinux
编译器信息是 clang-18
:
2.3.3 运行
qemu-system-aarch64 -machine virt,virtualization=true,gic-version=3 \
-cpu cortex-a53 -smp 2 -m 1024M \
-nographic \
-kernel linux-6.13.2/arch/arm64/boot/Image \
-append "console=ttyAMA0 root=/dev/vda rw rootfstype=ext4 init=/init" \
-drive file=arm64-ubuntu-20.04.1.img,format=raw,index=0,media=disk
其中 arm64-ubuntu-20.04.1.img
为根文件系统镜像,读者可自行通过 busybox
,buildroot
等工具进行构建,本文不做涉及。
看一下运行后效果:
$ uname -r
6.13.2
$ ls -l /sys/kernel/sched_ext/
total 0
-r--r--r-- 1 root root 4096 Feb 16 17:41 enable_seq
-r--r--r-- 1 root root 4096 Feb 16 17:41 hotplug_seq
-r--r--r-- 1 root root 4096 Feb 16 17:41 nr_rejected
-r--r--r-- 1 root root 4096 Feb 16 17:41 state
-r--r--r-- 1 root root 4096 Feb 16 17:41 switch_all
3. 参考资料
- 内核文档:Documentation/kbuild/llvm.rst
- 内核文档:Documentation/scheduler/sched-ext.rst
- 内核文档:tools/sched_ext/README.md