eBPF 核心技术与实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
11506 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 29 讲/共 37 讲
eBPF 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 进击的Lancelot
    XDP 程序类型老师已经讲过,这里不再赘述。 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归属地:广东
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部