当前位置: 首页 > news >正文

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

文章目录

  • 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 18sudo 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
http://www.lryc.cn/news/538264.html

相关文章:

  • Redis 的集群 --- 数据分开扛
  • 微信小程序中缓存数据全方位解惑
  • LeetCode 每日一题 2025/2/10-2025/2/16
  • 使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
  • DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
  • 设计模式:代理模式
  • 141,【1】buuctf web [SUCTF 2019]EasyWeb
  • 破解微服务疑难杂症:2025年全解决方案
  • Node.js 中的 Event 模块详解
  • EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
  • pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
  • 【玩转全栈】----Django模板语法、请求与响应
  • 网络安全:挑战、技术与未来发展
  • DeepSeek 服务器繁忙的全面解决方案
  • 将OpenWrt部署在x86服务器上
  • 计算机视觉:卷积神经网络(CNN)基本概念(一)
  • 企业文件共享中的权限管理与安全风险防范
  • 使用DeepSeek建立一个智能聊天机器人0.12
  • 国家队出手!DeepSeek上线国家超算互联网平台!
  • Deep seek学习日记1
  • 乐理笔记(持续更新)
  • 【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】
  • PHP高效、轻量级表格数据处理库 OpenSpout ,很好用
  • 2010年上半年软件设计师考试上午真题的知识点整理(附真题及答案解析)
  • EventSource的使用
  • 【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】
  • RocketMq中RouteInfoManger组件的源码分析
  • java八股文-mysql
  • Cherno C++ P55 宏
  • MybatisMybatisPllus公共字段填充与配置逻辑删除