ebpf - 根据内核版本使用ringbuf和perfbuf

2024-02-17

我正在使用 ebpf 来捕获进程创建。我对内核 5.8 及更高版本使用ringbuf,并希望在同一 ebpf 内核文件中对旧内核使用 perfbuf。有一个关于它的很棒的博客https://nakryiko.com/posts/bpf-core-reference-guide/#linux-kernel-version https://nakryiko.com/posts/bpf-core-reference-guide/#linux-kernel-version,根据它我可以使用如下代码:

if (LINUX_KERNEL_VERSION < KERNEL_VERSION(5, 8, 0))
{
    // use the perfbuf
}
else
{
    // use the ringbuf
}

并且加载器会忽略死代码。 问题是如何在这种情况下声明环形缓冲区映射,因为它是在全局范围内声明的,而不是在函数内部声明的:

struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 64 * 4096);
} rb SEC(".maps");

在 5.8 之前的内核中,BPF_MAP_TYPE_RINGBUF 未定义,加载失败。 是否有一些被调用的初始化函数,我可以根据内核版本定义并添加映射?


像这样的地图创建始终由加载程序执行。因此,您可以声明环形缓冲区和性能缓冲区,并以仅加载两者之一的方式编写用户空间程序。

一般来说,不建议使用内核版本来检测功能支持,因为某些发行版会将某些功能向后移植到较旧的内核版本(例如 RedHat enterprise)。

因此,如果可能的话,建议使用由bpftool https://man.archlinux.org/man/bpftool-feature.8.en or 纤毛/ebpf https://github.com/cilium/ebpf/blob/c7ba7f0508dee2866973e455d1c6f28b44958cb6/features/map.go#L18.

如果是bpftool也可以要求命令输出 C 宏,它允许您使用#ifdefeBPF 代码中的预处理器语句(尽管这需要在目标上进行编译)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ebpf - 根据内核版本使用ringbuf和perfbuf 的相关文章

  • 使用 PHP 在网站上切换语言

    我只是在寻求一些建议 我正在创建一个提供 至少 2 种语言的网站 我设置它的方法是使用 PHP 语言的 XML 文件来检索 XML 节点中的值 假设您有任何 XML 文件 加载方式如下 一旦文件内容可用 我只需将每个节点输出到 HTML 标
  • AVPlayer - 播放时切换流质量

    我在用着AVPlayer为了播放 youtube 视频 对于每个 youtube 视频 ID 我检索几个不同质量的流 url 我想根据网络状态播放特定的流质量 例如 如果用户使用 3G 我想播放最低质量的 URL 但如果用户移动到 wifi
  • 有没有办法知道 WPF 应用程序是否正在关闭?

    我正在编写一些代码来检查我的资源是否已正确清理 当应用程序关闭时 资源不会被清理 这很好 但是 这使我的检查代码失败 有没有办法知道 WPF 应用程序是否正在关闭 像Application Current IsShuttingDown 之类

随机推荐