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

ebpf: CO-RE, BTF, and Libbpf(三)

本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。
本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/

CO-RE 用户空间代码

ebpf 程序主要包含两部分: 会被载入到内核空间中运行的主要功能逻辑代码; 以及控制 ebpf 程序的载入, 生命周期等的用户空间代码. 接下来展示用户空间部分的代码及讲解.

ebpf 提供了一些供用户空间使用的非常方便的接口, 用于执行加载 ebpf 程序, 将其附着到对应事件上, 或者访问 map 信息等. 这些接口在一个叫做 skeleton 的文件中. 我们可以用 bpftool 通过 ebpf 的 elf 文件生成. 指令如下:

bpftool gen skeleton hello-buffer-config.bpf.o > hello-buffer-config.skel.h

这部分已经在 Makefile 中写好了:

TARGET = hello-buffer-config
BPF_OBJ = ${TARGET:=.bpf.o}
USER_C = ${TARGET:=.c}
USER_SKEL = ${TARGET:=.skel.h}
...
$(USER_SKEL): $(BPF_OBJ)bpftool gen skeleton $< > $@

hello-buffer-config.skel.h 中封装了我们编写用户空间代码需要用到的一些函数, 如下图所示, 都是以 hello_buffer_config_bpf__ 为前缀的. 比如这里将 open 和 load 封装为一个函数 hello_buffer_config_bpf__open_and_load , 更便于使用.
skeleton
最终还是调用的 libbpf 中的函数, 定义在 libbpf/src/libbpf.c 中.

main函数部分如下所示:
在这里插入图片描述

  1. libbpf_set_print 设定了一个回调函数, 在该程序打印 log 时会调用 libbpf_print_fn
    在这里插入图片描述

  2. 调用 hello_buffer_config_bpf__open_and_load , 会生成一个 skel 结构体, 包含所有的 map 和程序代码, 并将其加载到内核中

  3. 将程序自动附着在对应的时间中, 这里著需要传入 skel , 因为 skel 已经包含整个 ebpf 程序所有信息, 自然也包括 section , event 信息. 如果没有明确定义 SEC 的话, 将会自动附着到所有的事件上, 如 kprobe, xdp 等等.

  4. 创建一个结构体, 用来存储 perf buffer output. handle_event 是在perf buffer 中有新数据的时候会调用的回调函数; lost_event 是在 perf buffer 中预警没有足够的空间来荣达新数据时调用的回调函数. 这里只是简单的打印相关信息.
    在这里插入图片描述

  5. 轮询 perf buffer. 回调函数就是上面定义的 handle_eventlost_event

  6. 清理代码, 释放 perf buffer 并销毁 eBPF 程序和 map.

这个程序的最终执行结果如下所示:
在这里插入图片描述

总结

CO-RE 可以使 eBPF 程序可以在一个机器上编译, 而且另外一个 (拥有不同内核版本的) 机器上运行. 这极大的提升了 eBPF 程序的可移植性.

编译器在编译时保存完整的程序和结构体相关信息, 并在将程序加载到内核中时, 使用保存的重定位信息来重写指令, 以确保在不同内核版本也能成功访问到相关的结构体成员 (即使成员位置, 名字发生变化, 甚至被删除).

此外, 用户空间程序也至关重要, 管理着 eBPF 程序的加载, 撤销, 生命周期等. 我们可以通过使用 bpftool 生成的 BPF skeleton 中封装好的更为便捷的函数来编写用户空间代码.

http://www.xdnf.cn/news/699.html

相关文章:

  • BurpSuite 1.4.07 详细使用指南:安装、配置与渗透测试实战
  • OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)
  • 零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
  • 初级达梦dba的技能水准
  • C++:详解命名空间
  • 清醒思考的艺术
  • 二叉树的顺序结构及实现
  • 【第一天】一月速通python,第一天基本语法
  • ZYNQ笔记(九):定时器中断
  • (done) 吴恩达版提示词工程 1. 引言
  • 软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
  • C语言之机房机位预约系统
  • oracle认证大师ocm学习
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.23)
  • 基于Spring AI Alibaba实现MCP协议的SSE实时流式服务深度解析
  • 肖特基二极管详解:原理、作用、应用与选型要点
  • Cribl 对Windows-xml log 进行 -Removing filed-06
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类尺寸QSizeF)
  • 常见浏览器 WebDriver 驱动下载
  • PCL库开发入门
  • Kubernetes控制平面组件:调度器Scheduler(一)
  • 基于深度学习的线性预测:创新应用与挑战
  • 探秘STM32如何成为现代科技的隐形引擎
  • 【锂电池SOH估计】SVM支持向量机锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)
  • HTMLCSS实现网页轮播图
  • DB-Day9笔记-用户权限数据库备份事务索引视图
  • BFD协议原理
  • PH热榜 | 2025-04-20
  • 安卓处理登录权限问题
  • 09【所有权·核心】规则与移动 (Move):Rust 内存安全基石详解