【问题标题】:What is variable attribute SEC means?可变属性 SEC 是什么意思?
【发布时间】:2021-05-16 06:42:49
【问题描述】:

目前,我正在跟踪一个 bpf 程序,发现了一些我无法理解的内容。

有几个声明,如:

struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");

我的问题是:

  1. 这个语法叫什么?
  2. 这和__attribute__((section("name")))一样吗?
  3. map.map 有什么不同?它们只是用户定义的部分吗?

【问题讨论】:

  • 这是一个宏。寻找 #define SEC 看看它的作用。

标签: c bpf ebpf


【解决方案1】:

这是为 BTF 声明对象的结构(在本例中为地图的键)。

SEC()__attribute__((section("name"), used)) 相同,所以它的作用是将定义的对象放入给定的 ELF 部分。

现在,eBPF 映射已经(并且仍然可以)在 maps ELF 部分中定义,以便 libbpf 能够解析相关元数据并在程序可以使用它们之前找到或创建这些映射,因此:SEC("maps") .

SEC()其他 调用是将附加元数据放入.maps ELF 部分:此信息是map_keys结构 的声明,它告诉密钥是由哪些字段组成的。 Libbpf 将使用这些信息来生成与地图结构相关的 BTF 信息。该信息被传递给内核,并且可以用于多种目的。一个用例是在检查映射时查看映射的结构,例如使用bpftool map dump,并轻松地单独转储每个键(和值)字段,而不是为键(或值)是由。内核还可以将其用于其他高级 eBPF 功能:例如,在映射条目中的字段上使用自旋锁需要存在 BTF 信息,以便内核可以了解结构字段是什么以及应该锁定哪个字段。

[编辑] 使用 maps 部分是声明地图的“传统”方式,在没有 BTF 的情况下仍然有效。添加 BTF 信息后,所有内容(地图元数据和结构布局)都应进入 .maps 部分,但支持与 maps 中的元数据冗余。通常,在声明到.maps 时不要使用maps,因为这没有用。

一些与BTF相关的指针:blog postkernel documentation。另请参阅 cmets 中的 OP 链接。

所以直接回答你的问题:

  1. 在本例中,该语法用于声明映射元数据(大小、类型等)(maps) 以及映射键的结构 (.maps)。
  2. SEC() 宏本身与您提供的相同。
  3. maps.maps 是不同的 ELF 部分。它们由用户定义,但它们被 libbpf 用作约定来解析来自 ELF 对象的数据并提取映射的元数据,以及元数据映射条目的结构。

【讨论】:

  • 感谢您的回答。我可以声称.mapsmaps 部分都做同样的事情:定义地图吗?我觉得.maps声明的语法可以改写成maps版本吧?
  • 我不确定上述结论是否等于“”所有地图都应在 .maps ELF 部分中定义。可以在 maps 部分中同时拥有“旧版”地图定义,在 .maps 部分中拥有 BTF 定义的地图。“””或没有。全文可在此处找到:lore.kernel.org/bpf/20190611043505.14664-7-andriin@fb.com
  • 对,看到你的例子,我认为 maps.maps 中的声明是互补的,但是再看一遍(是的,这是正确的来源)你可以只使用.maps。例如,这就是内核样本所做的。我会修正我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2010-09-21
  • 2016-04-06
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多