BPF 类型格式 (BTF)¶

BPF 类型格式 (BTF)¶

4.4 .BTF.base 段¶

分割 BTF(其中 .BTF 段仅包含关联的基础 .BTF 段中不存在的类型)是一种为内核模块编码类型信息的极其有效的方法,因为它们通常由一些模块特定类型和大量共享内核类型组成。前者编码在分割 BTF 中,而后者编码在基础 BTF 中,从而产生更紧凑的表示。分割 BTF 中引用基础 BTF 中类型的类型使用其基础 BTF ID 进行引用,并且分割 BTF ID 从 last_base_BTF_ID + 1 开始。

然而,这种方法的缺点是它使得分割 BTF 变得有些脆弱——当基础 BTF 发生变化时,基础 BTF ID 引用将不再有效,分割 BTF 本身也变得无用。.BTF.base 段的作用是使分割 BTF 在基础 BTF 可能发生变化的情况下更具弹性,例如内核模块并非每次内核构建时都重新构建的情况。.BTF.base 包含命名基础类型;INTs、FLOATs、STRUCTs、UNIONs、ENUM[64]s 和 FWDs。INTs 和 FLOATs 在 .BTF.base 段中完全描述,而像结构体和联合体这样的复合类型则没有完全定义——.BTF.base 类型仅用作分割 BTF 引用的类型的描述,因此结构体/联合体在 .BTF.base 段中拥有 0 个成员。ENUM[64]s 也以 0 个成员记录。任何其他类型都添加到分割 BTF 中。这种提炼过程使我们得到一个包含基础类型最小描述的 .BTF.base 段和一个引用这些基础类型的 .BTF 分割段。稍后,我们可以使用 .BTF.base 段中存储的信息和新的 .BTF 基础来重定位分割 BTF;.BTF.base 段中的类型信息允许我们更新分割 BTF 引用以指向相应的新基础 BTF ID。

BTF 重定位发生在内核模块加载时,当内核模块包含 .BTF.base 段时,libbpf 也提供了 btf__relocate() API 来实现此功能。

举例来说,考虑以下基础 BTF:

[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED

[2] STRUCT 'foo' size=8 vlen=2

'f1' type_id=1 bits_offset=0

'f2' type_id=1 bits_offset=32

...以及关联的分割 BTF:

[3] PTR '(anon)' type_id=2

即,分割 BTF 描述了一个指向 struct foo { int f1; int f2 }; 的指针。

.BTF.base 将包含:

[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED

[2] STRUCT 'foo' size=8 vlen=0

如果我们稍后使用以下新的基础 BTF 重定位分割 BTF:

[1] INT 'long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)

[2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED

[3] STRUCT 'foo' size=8 vlen=2

'f1' type_id=2 bits_offset=0

'f2' type_id=2 bits_offset=32

...我们可以使用我们的 .BTF.base 描述来知道分割 BTF 引用指向 struct foo,重定位结果生成新的分割 BTF:

[4] PTR '(anon)' type_id=3

请注意,我们必须更新分割 BTF 的 BTF ID 和起始 BTF ID。

因此,我们看到 .BTF.base 如何促进后续重定位,从而实现更具弹性的分割 BTF。

对于非内核源码树的内核模块构建(即设置了 KBUILD_EXTMOD 的情况,如“make M=path/2/mod”),.BTF.base 段将自动生成。.BTF.base 的生成需要 pahole 支持“distilled_base”BTF 功能;此功能在 pahole v1.28 及更高版本中可用。

相关推荐

家电能效标识的正确打开方式
AMAZFIT智能手表使用总结(通话|测心率|天气|听音乐|显色)
crm销售管理系统软件哪个好用?2025最新推荐及功能对比分析
​杨幂三围多少 傲人上围身材有料
李明当年落选韩日世界杯背后的内幕
【后会无期拍摄地点】后会无期拍摄地点在哪,后会无期在哪里拍摄
5个值得推荐的APK下载站点
cba常规赛打平了怎么办 , 篮球半场平局怎么算输赢
日本位于哪个半球

日本位于哪个半球

10-13 👁️ 960