目前,我正在跟踪 bpf 程序并发现一些我无法理解的内容。
有几个声明,例如:
struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");
Run Code Online (Sandbox Code Playgroud)
我的问题是:
__attribute__((section("name")))?map和之间有什么不同.map?它们只是用户定义的部分吗?Qeo*_*ole 10
这是为了声明BTF的对象结构(在本例中为映射的键)。
\nSEC()与 so相同,__attribute__((section("name"), used))它的作用是将定义的对象放入给定的 ELF 部分。
现在,eBPF 映射已经(并且仍然可以)在 ELF 部分中定义,maps以便 libbpf 能够解析相关元数据并在程序使用它们之前找到或创建这些映射,因此:SEC("maps")。
另一个调用是将附加元数据放入ELF 部分:此信息是结构的声明,它告诉键由哪些字段组成。Libbpf将使用这些信息来生成与映射结构相关的BTF信息。该信息被传递到内核,并且可以用于多种目的。一种用例是在检查映射时查看映射的结构,例如使用和 轻松转储每个键(和值)字段,而不是为整个结构打印原始的单个十六进制 blob,键(或值)是制成的。内核还可以将其用于其他高级 eBPF 功能:例如,在映射条目中的字段上使用自旋锁需要存在 BTF 信息,以便内核可以了解结构体字段是什么以及应该锁定哪个字段。SEC().mapsmap_keysbpftool map dump
[编辑] 使用该maps部分是 \xe2\x80\x9clegacy\xe2\x80\x9d 声明映射的方式,在没有 BTF 的情况下声明时仍然有效。添加 BTF 信息后,所有内容(地图元数据和结构布局)都应进入该部分,尽管支持.maps元数据冗余。通常,在声明 into 时maps不使用,因为这没有用。maps.maps
一些与 BTF 相关的指针:博客文章、内核文档。另请参阅评论中OP的链接。
\n所以直接回答你的问题:
\nmaps) 以及映射键的结构 ( )。.mapsSEC()本身与您提供的宏相同。maps和.maps是不同的 ELF 部分。它们由用户定义,但 libbpf 将它们用作约定来解析来自 ELF 对象的数据并分别提取映射的元数据以及映射条目的元数据和结构。