可变属性SEC是什么意思?
What is variable attribute SEC means?
目前,我正在跟踪一个 bpf 程序,发现了一些我无法理解的东西。
有几个声明如下:
struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");
我的问题是:
- 这个语法叫什么?
- 这和
__attribute__((section("name")))
一样吗?
map
和 .map
有什么区别?它们只是用户定义的部分吗?
这是为了声明 BTF.
对象的结构(在本例中为地图的键)
SEC()
与 __attribute__((section("name"), used))
相同,所以它所做的是将定义的对象放入给定的 ELF 部分。
现在,eBPF 映射已经(并且仍然可以)在 maps
ELF 部分中定义,以便 libbpf 能够解析相关的元数据并在程序可以使用它们之前找到或创建这些映射,因此: SEC("maps")
.
other 对 SEC()
的调用是将额外的元数据放入 .maps
ELF 部分:此信息是 [=43= map_keys
的 ]structure,它告诉了键由哪些字段组成。 libbpf 将使用此信息生成与映射结构相关的 BTF 信息。此信息传递给内核,可用于多种目的。一个用例是在检查地图时查看地图的结构,例如使用 bpftool map dump
,并轻松地单独转储每个键(和值)字段,而不是为整个结构打印原始的单个十六进制 blob (或价值)是由。内核也可以将它用于其他高级 eBPF 功能:例如,在映射条目中的字段上使用自旋锁需要存在 BTF 信息,以便内核可以了解结构字段是什么以及应该锁定哪个字段。
[编辑] 使用 maps
部分是声明地图的“传统”方式,在没有 BTF 的情况下声明时仍然有效。添加 BTF 信息时,所有内容(地图元数据和结构布局)都应进入 .maps
部分,尽管支持 maps
中元数据的冗余。通常,在声明为 .maps
时不使用 maps
,因为这没有用。
一些与 BTF 相关的提示:blog post, kernel documentation。另请参阅评论中的 OP link。
所以直接回答你的问题:
- 在本例中,语法用于声明映射元数据(大小、类型等)(
maps
) 以及映射键的结构 (.maps
)。
SEC()
宏本身与您提供的相同。
maps
和 .maps
是不同的 ELF 部分。它们由用户定义,但它们被 libbpf 用作约定,以从 ELF 对象解析数据并提取映射的元数据,以及元数据 和 映射条目的结构, 分别.
目前,我正在跟踪一个 bpf 程序,发现了一些我无法理解的东西。
有几个声明如下:
struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");
我的问题是:
- 这个语法叫什么?
- 这和
__attribute__((section("name")))
一样吗? map
和.map
有什么区别?它们只是用户定义的部分吗?
这是为了声明 BTF.
对象的结构(在本例中为地图的键)SEC()
与 __attribute__((section("name"), used))
相同,所以它所做的是将定义的对象放入给定的 ELF 部分。
现在,eBPF 映射已经(并且仍然可以)在 maps
ELF 部分中定义,以便 libbpf 能够解析相关的元数据并在程序可以使用它们之前找到或创建这些映射,因此: SEC("maps")
.
other 对 SEC()
的调用是将额外的元数据放入 .maps
ELF 部分:此信息是 [=43= map_keys
的 ]structure,它告诉了键由哪些字段组成。 libbpf 将使用此信息生成与映射结构相关的 BTF 信息。此信息传递给内核,可用于多种目的。一个用例是在检查地图时查看地图的结构,例如使用 bpftool map dump
,并轻松地单独转储每个键(和值)字段,而不是为整个结构打印原始的单个十六进制 blob (或价值)是由。内核也可以将它用于其他高级 eBPF 功能:例如,在映射条目中的字段上使用自旋锁需要存在 BTF 信息,以便内核可以了解结构字段是什么以及应该锁定哪个字段。
[编辑] 使用 maps
部分是声明地图的“传统”方式,在没有 BTF 的情况下声明时仍然有效。添加 BTF 信息时,所有内容(地图元数据和结构布局)都应进入 .maps
部分,尽管支持 maps
中元数据的冗余。通常,在声明为 .maps
时不使用 maps
,因为这没有用。
一些与 BTF 相关的提示:blog post, kernel documentation。另请参阅评论中的 OP link。
所以直接回答你的问题:
- 在本例中,语法用于声明映射元数据(大小、类型等)(
maps
) 以及映射键的结构 (.maps
)。 SEC()
宏本身与您提供的相同。maps
和.maps
是不同的 ELF 部分。它们由用户定义,但它们被 libbpf 用作约定,以从 ELF 对象解析数据并提取映射的元数据,以及元数据 和 映射条目的结构, 分别.