变量属性SEC是什么意思?

Ste*_*ven 5 c bpf ebpf

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

有几个声明,例如:

struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Qeo*_*ole 10

这是为了声明BTF的对象结构(在本例中为映射的键)。

\n

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

\n

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

\n

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

\n

[编辑] 使用该maps部分是 \xe2\x80\x9clegacy\xe2\x80\x9d 声明映射的方式,在没有 BTF 的情况下声明时仍然有效。添加 BTF 信息后,所有内容(地图元数据和结构布局)都应进入该部分,尽管支持.maps元数据冗余。通常,在声明 into 时maps不使用,因为这没有用。maps.maps

\n

一些与 BTF 相关的指针:博客文章内核文档。另请参阅评论中OP的链接。

\n

所以直接回答你的问题:

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