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

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 中封装好的更为便捷的函数来编写用户空间代码.

相关文章:

  • 标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad
  • VLC搭建本机的rtsp直播推流和拉流
  • 如何成为Agent工程师:学习路径、核心技能与职业规划
  • 深入剖析 MySQL 中用户授权机制及操作
  • 指针(3)
  • 【上位机——MFC】MFC入门
  • day 22 作业
  • 实战指南:封装Faster-Whisper为FastAPI接口并实现高并发处理-附整合包
  • SAP PO开发-端到端配置
  • 2.1 基于委托的异步编程方法
  • SSRF学习
  • Spring 01
  • 9、Hooks:现代魔法咒语集——React 19 核心Hooks
  • 数字系统与编码
  • 计算机组成原理笔记(十六)——4.1基本算术运算的实现
  • Java Streams 使用教程
  • 即梦AI与可灵AI视频生成功能对比分分析
  • AI与思维模型【70】——遗忘曲线
  • 从外网访问局域网服务器的方法+Linux文件和命令
  • App-Controller - 通过自然语言操控应用程序的智能框架
  • 央行等:在上海试点通过再贴现窗口支持人民币跨境贸易融资
  • 玉渊谭天丨这是一个时代的结束
  • 语言天才、魔方大师,击败王楚钦前他豪言:我能比中国球员强
  • 加快从数量增长向品质跃升转变,促进生态空间与城市功能有机共生!龚正调研公园城市建设工作
  • 纪念沈渭滨︱初五沈大大  浓浓师生情
  • 自然资源部一季度新批用海项目中,涉历史遗留围填海项目56个