26|技术解析:eBPF程序参数原理详解
倪朋飞

你好,我是倪朋飞。
在第 6 讲 各类 eBPF 程序的触发机制及其应用场景 中,我曾讲过 eBPF 程序的分类以及每种不同类型程序的使用场景。而在后续的实战进阶篇中,也通过多讲课程详细为你讲述了各种类型 eBPF 程序的开发方法。但是,无论在课程留言区还是微信讨论群中,依然有很多同学不清楚如何从零开发一个 eBPF 程序,特别是开发的第一步———到底该如何为要开发的 eBPF 程序设置参数。
今天,我就带你一起来深入探讨这个问题,看看不同类型 eBPF 程序的参数到底是如何设置的,它们的返回值又代表着什么含义。
再谈 eBPF 程序
我相信你一定已经开发了很多不同的 eBPF 程序了,也已经跟随我们课程学习了很多常用 eBPF 程序的使用方法。简单来说,eBPF 程序就是通过 C 语言开发并可被编译为 eBPF 字节码的程序,而这个程序中最核心的就是挂载到内核态或用户态事件的 eBPF 函数。
在开发 eBPF 程序过程中,我想你一定已经体会到 eBPF 中的函数远没有普通程序中的函数那么灵活,其编程模型与普通程序有着明显的不同。与普通程序相比,eBPF 程序不仅无法随意调用各种库函数,而且其函数功能相对受限。这些限制主要源于 eBPF 的设计理念和安全考虑。
eBPF 指令集定义了严格的函数调用约定,所有 eBPF 程序都必须遵循,以确保在内核环境中的安全和高效运行。这些约定包括:
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. eBPF程序的编程模型与普通程序有明显不同,受到严格的函数调用约定限制,包括寄存器的使用和参数传递方式。 2. eBPF函数的参数传递不通过堆栈,因此5个参数是硬限制,想要传递更多参数需要使用结构体来解决。 3. eBPF程序的设计理念和安全考虑导致其函数功能相对受限,无法随意调用各种库函数。 4. eBPF指令集定义了严格的函数调用约定,所有eBPF程序都必须遵循,以确保在内核环境中的安全和高效运行。 5. 跟踪类eBPF程序的参数格式灵活,可以通过多种方式来构造eBPF程序参数,而返回值通常没有任何作用。 6. 网络类和cGroup类eBPF程序的参数格式有严格的定义格式,并且它们的返回值也都有明确的定义,通常代表对数据包的处理决定。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《eBPF 核心技术与实战》,新⼈⾸单¥59
《eBPF 核心技术与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- 进击的LancelotXDP 程序类型老师已经讲过,这里不再赘述。 TC 类型的返回值有 TC_ACT_OK(放行) 和 TC_ACT_SHOT(丢弃),可以参考 定义:https://elixir.bootlin.com/linux/v6.8/source/samples/bpf/net_shared.h#L17 示例:/samples/bpf/tc_l2_redirect_kern.c 至于 kprobe,大部分情况下返回值都是和 map 访问相关的错误处理,以 /samples/bpf/tracex6.bpf.c 为例,具体可以参考 get_map_perf_counter 实现(https://elixir.bootlin.com/linux/v6.8/source/kernel/trace/bpf_trace.c#L549)2024-12-27归属地:广东
收起评论