谁在 BPF 中创建地图

2024-01-30

看完之后man bpf以及其他一些文档来源,我的印象是map只能由用户进程创建。然而下面这个小程序似乎神奇地 create bpf map:

struct bpf_map_def SEC("maps") my_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(u32),
        .value_size = sizeof(long),
        .max_entries = 10,
};

SEC("sockops")
int my_prog(struct bpf_sock_ops *skops)
{
   u32 key = 1;
   long *value;
   ...

   value = bpf_map_lookup_elem(&my_map, &key);
   ...
   return 1;
}

所以我用内核加载程序tools/bpf/bpftool并验证程序是否已加载:

$ bpftool prog show
1: sock_ops  name my_prog  tag f3a3583cdd82ae8d
        loaded_at Jan 02/18:46  uid 0
        xlated 728B  not jited  memlock 4096B

$ bpftool map show
1: array  name my_map  flags 0x0
        key 4B  value 8B  max_entries 10  memlock 4096B

当然地图是空的。然而,删除bpf_map_lookup_elem从程序中导致没有创建地图。

UPDATE我用它调试了strace并发现在这两种情况下,即bpf_map_lookup_elem如果没有它,bpftool 会调用bpf(BPF_MAP_CREATE, ...)显然它成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我会继续bpftool map show, and bpf(BPF_MAP_GET_NEXT_ID, ..)立即返回ENOENT,而且它永远不会转储地图。很明显,有些东西没有完成地图创建。

所以我想知道这是否是预期的行为?

Thanks.


正如 antiduh 所解释的,并与您确认strace检查,bpftool在本例中是创建映射的用户空间程序。它调用函数bpf_prog_load()来自 libbpf(在tools/lib/bpf/),最终执行系统调用。然后将程序固定在所需位置(在bpf虚拟文件系统挂载点),以便 bpftool 返回时不会卸载它。地图未固定。

关于地图创建,神奇的部分也发生在 libbpf 中。什么时候bpf_prog_load()被调用时,libbpf 接收目标文件的名称作为参数。bpftool不要求加载this具体计划或that具体地图;相反,它提供目标文件,而 libbpf 必须处理它。于是libbpf中的函数解析这个ELF目标文件,最终找到一些对应于地图和程序的节。然后它尝试加载第一个程序。

加载该程序包括以下步骤:

CHECK_ERR(bpf_object__create_maps(obj), err, out);
CHECK_ERR(bpf_object__relocate(obj), err, out);
CHECK_ERR(bpf_object__load_progs(obj), err, out);

换句话说:首先创建我们在目标文件中找到的所有映射。然后执行映射重定位(即将映射索引与eBPF指令相关联),最后加载程序指令。

所以关于你的问题:在这两种情况下,有和没有bpf_map_lookup_elem(),地图是用bpf(BPF_MAP_CREATE, ...)系统调用。之后,会发生重定位,并且程序指令会根据需要进行调整以指向新创建的地图。然后,一旦完成所有步骤并加载程序,bpftool退出。 eBPF 程序应该被固定,并且仍然加载到内核中。据我了解,如果does使用地图(如果bpf_map_lookup_elem()被使用),那么映射仍然被加载的程序引用,并保存在内核中。另一方面,如果程序not使用映射,那么就没有什么可以阻止它们,因此当文件描述符持有时映射会被销毁bpftool都关闭,当bpftool返回。

所以最后,当bpftool完成后,如果程序使用它,则在内核中加载了一个映射,但如果没有程序依赖它,则没有映射。在我看来,这听起来像是预期的行为;但如果您遇到奇怪的事情,请以某种方式进行 pingbpftool,我是从事该实用程序工作的人员之一。最后一项一般观察:如果需要保留映射,即使没有程序使用它们,映射也可以固定并保留在内核中。

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

谁在 BPF 中创建地图 的相关文章

  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • 使用 bitbake 为 BBB 构建 .dtbo 覆盖

    我使用内核 linux ti staging 4 14 和自定义设备树为我的 BBB 构建了 yocto 发行版 rocko 由于我需要将一个旧项目从 Debian 移植到 Yocto 因此我还需要在内核中启用 UIO 功能 这也可以正常工
  • 在内核模块中执行shell命令

    是否可以在内核模块中执行shell命令 我知道我们可以在用户空间 C 代码中使用system子程序 我正在调试一个存在内存泄漏问题的内核模块 在无限循环中执行 insmod 和 rmmod module ko 后 8G RAM 的系统在几分
  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • 使用Linux虚拟鼠标驱动

    我正在尝试实施一个虚拟鼠标驱动程序根据基本 Linux 设备驱动程序书 有一个用户空间应用程序 它生成坐标以及内核模块 See 虚拟鼠标驱动程序和用户空间应用程序代码 http www embeddedlinux org cn Essent
  • 内存地址是否指向一个字节的信息?

    以下是 DTS 文件的摘录 linux arch powerpc boot dts 板名 dts memory device type memory reg lt 0x00000000 0x40000000 gt 1GB at 0 嵌入式设
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何通过jiffies实现经过时间

    我想了解如何在 C 中使用 jiffies 实现经过时间 假设我有一系列指令 include
  • 对于attach_xdp,标志是否控制模式?

    当我将 xdp 与 eBPF 一起使用时 我想我可以使用 ip link 来设置模式 例如 ip link set dev eno1 xdpoffload obj xdp o sec text 我想知道 xdpoffload 或通用或本机模
  • 在 Linux 内核中使用断言

    我有一个问题assert 在Linux中 我可以在内核中使用它吗 如果不是 例如 如果我不想输入 NULL 指针 您通常会使用什么技术 对应的内核宏是BUG ON and WARN ON 前者适用于当您想让内核恐慌并使系统崩溃 即不可恢复的
  • 编译Linux内核模块时出现错误:“CONFIG_X86_X32已启用,但没有binutils支持”和不需要的“n”字符

    我想得到Rasta Ring0 调试器 http rr0d droids corp org 在我的 x86 64 Linux 中编译的 0 3 版本 它是一个 Linux 内核模块 我已将 32 位内联汇编替换为 64 位汇编 如我的问题中
  • 在设备驱动程序中传递自定义标志以“打开”

    我需要将一些自定义标志传递给open 我的设备驱动程序的调用 我在LDD3中找到了这个例子 int dev open struct inode inode struct file filp if filp gt f flags O ACCM
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道

随机推荐

  • 这些字符是什么:⎲⎳?

    我使用 Lyx Latex 发行版 将我的内容转换为 HTML 页面 我注意到 Firefox 中表示的西格玛符号由这两个字符组成 第一个字符代表 Sigma 符号的上半部分 第二个字符代表下半部分 我试图在谷歌上搜索这些 奇怪 的字符 但
  • 编译器版本与 .NET Framework 版本 - ASP.NET 应用程序的场景

    设想 我的客户端计算机上有针对 3 5 的 VS 2010 C 4 编译器 我正在开发 ASP NET 应用程序 我在类文件中使用可选参数 支持 C 4 并编译代码 一切似乎都工作正常 后来在运行时发现了一个问题 其中一个旧的 我相信是经典
  • javascript 数组作为字符串列表(保留引号)

    我有一个字符串数组 当我使用 toString 输出它时 引号不会保留 这使得使用 in 构建 mysql 查询变得困难 考虑以下 SELECT FROM Table WHERE column IN item1 item2 item3 it
  • 调用 Camera.release() 后相机正在被使用

    在我的 Android 应用程序中按下拍照按钮后 相机崩溃并显示以下错误消息 E 03 21 2016 10 29 49 164 000007d1 CameraObject Camera is being used after Camera
  • 不使用 WHERE 语句的 INT 比较

    我正在尝试编写一条 MySQL 语句来返回这些结果 Name Day 0 Day 1 Day 2 Day 3 Day 4 Day 5 Jeff 0 3 1 2 1 1 Larry 1 1 4 4 1 0 基于每个员工每天执行的任务数量 我的
  • 如何设置任务经常运行?

    如何让脚本每隔 30 分钟运行一次 我认为不同的操作系统有不同的方法 我正在使用 OS X 只需使用launchd 它是一个非常强大的启动器系统 同时它也是 Mac OS X 的标准启动器系统 如果没有它 当前的 OS X 版本甚至无法启动
  • SceneKit:材质预览始终为黑色

    在 Xcode 中 我有一个从 DAE 文件转换而来的 SCN 文件 我与模型制作者一起设置了所有基于物理 PBR 的设置 但无论我做什么 预览总是黑色的 另外 如果我将环境更改为程序天空 模型也会显示为黑色 I m aware that
  • 如何在 ggplot 中创建气泡网格图?

    I want to create bubble grid charts with ggplot somthing like this 我在网上找不到任何代码或示例 Thanks Using geom point具有离散的 x 和 y 尺度将
  • Python pandas 相当于 R groupby mutate

    因此 在 R 中 当我有一个由 4 列组成的数据框时 将其称为df我想计算一个组的和积之比 我可以用这样的方式 generate data df data frame a c 1 1 0 1 0 b c 1 0 0 1 0 c c 10 5
  • 我在 Ubuntu 14.04 中使用 codeigniter 出现 URL not found 问题错误

    我已将我的 codeigniter 项目与 Ubuntu 14 04 集成 在默认控制器 登录控制器 之后 它给了我 url not found 错误 请找到以下 htaccess 文件
  • Safari xhr (AJAX) 跨域重定向请求失败

    如何重现问题 使用 Safari 向服务器发出 AJAX 请求 让服务器响应 302 到不同的域 如果这些条件之一是not遇见了 就可以了 使用不同的浏览器 它可以工作 让服务器重定向到同一域 它可以工作 Load function in
  • 如何在 Maven 中关闭 findbugs“冗余空检查”?

    我找不到报告 冗余空检查 RCN REDUNDANT NULLCHECK OF NONNULL VALUE 的检测器的名称 有人知道它是什么吗 谷歌搜索只给了我大量的项目报告 自从我使用 JetBrains 以来 我遇到了很多错误 NotN
  • Objective-C:声明私有变量的不同方式。他们之间有什么区别吗?

    我想到了声明私有变量的不同方法 我想知道它们之间是否有任何差异 第一种方式 In h file interface DataExtract NSObject private double test 第二种方式 In m file test
  • 我应该使用 WebMatrix 构建一个真实的网站吗?

    我已经阅读了数百篇文章和博客文章 这些文章和博客文章都说 WebMatrix 只适合初学者等 我的问题是 为什么我不应该使用 WebMatrix 创建一个真实的工作网站 比如一个轻量级的问答网站 使用此工具 我们可以创建网站所需的任何内容
  • 使用 lxml 向现有元素添加属性、删除元素等

    我使用以下方法解析 XML from lxml import etree tree etree parse test xml etree XMLParser 现在我想处理已解析的 XML 我在删除具有命名空间的元素或仅删除一般元素时遇到问题
  • ConcurrentHashMap 有什么缺点吗?

    我需要一个可从多个线程访问的 HashMap 有两个简单的选项 使用普通的 HashMap 并在其上同步 或者使用 ConcurrentHashMap 由于 ConcurrentHashMap 不会阻止读取操作 因此它似乎更适合我的需求 几
  • 使用 jQuery get(0) 索引暂停和播放多个 HTML5 视频?

    我有一个包含多个视频的页面 人们可以单击缩略图来播放每个视频 问题是 对于超过 2 个视频 单击第三个缩略图不会暂停第二个视频 因此我会同时播放 2 个视频 我也在使用fadeOut 切换每个视频的可见性 无论视频数量多少 这都可以正常工作
  • Postman 的 Chrome 拦截器是否仍可与 Postman 的独立版本一起使用?

    我之前使用过 Postman Chrome 的扩展以及邮递员拦截器扩展 https chrome google com webstore detail postman interceptor aicmkgpgakddgnaphhhpliif
  • python 中的降噪算法不起作用

    我一直在尝试使用noisereduce pypi 算法来减少音频文件的噪音 但它给了我一个错误 Traceback most recent call last File C Users Seif Koretum Desktop noise
  • 谁在 BPF 中创建地图

    看完之后man bpf以及其他一些文档来源 我的印象是map只能由用户进程创建 然而下面这个小程序似乎神奇地 create bpf map struct bpf map def SEC maps my map type BPF MAP TY