Linux:用 clang 编译带 sched_ext 功能内核

发布于:2025-02-17 ⋅ 阅读:(145) ⋅ 点赞:(0)

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_BTFCONFIG_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 为根文件系统镜像,读者可自行通过 busyboxbuildroot 等工具进行构建,本文不做涉及。

看一下运行后效果:

$ 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. 参考资料

  1. 内核文档:Documentation/kbuild/llvm.rst
  2. 内核文档:Documentation/scheduler/sched-ext.rst
  3. 内核文档:tools/sched_ext/README.md

网站公告

今日签到

点亮在社区的每一天
去签到