首页 > 其他分享 >1月12日总结

1月12日总结

时间:2024-01-15 22:13:02浏览次数:19  
标签:总结 12 eBPF tail 调用 call prog array

两天有空,继续更新一篇有关 eBPF BCC 框架尾调用的内容。

eBPF 技术很新,能够参考的中文资料很少,而对于 BCC 框架而言,优秀的中文介绍和教程更是凤毛麟角。我尝试去网上检索有关尾调用的中文资料,BCC 框架的几乎没有。即使找到了,这些资料也难以给出可供参考和正确运行的例子。

BCC 框架的中文资料也就图一乐,真正有指导意义的,还得去看 Brendan Gregg 大神的博客和 bcc 项目。

既然如此,我来抛砖引玉,就简单介绍一下 eBPF 尾调用在 BCC 框架中是如何应用的吧。
1 何为尾调用?

引用 ebpf.io 网站的一句介绍:“尾调用允许 eBPF 调用和执行另一个 eBPF 并替换执行上下文,类似于一个进程执行 execve() 系统调用的方式。”

也就是说,尾调用之后,函数不会再返回给调用者了。

那么,eBPF 为什么要使用尾调用呢?这是因为,eBPF 的运行栈太有限了(仅有 512 字节),在递归调用函数时(实际上是向运行栈中一节一节地添加栈帧),很容易导致栈溢出。而尾调用恰恰允许在不增加堆栈的情况下,调用一系列函数。这是非常有效且实用的。

你可以使用下面的辅助函数来增加一个尾调用:

long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)

其三个参数的含义分别是:

ctx 向被调用者传递当前 eBPF 程序的上下文信息。
prog_array_map 是一个程序数组(BPF_MAP_TYPE_PROG_ARRAY)类型的 eBPF map,用于记录一组 eBPF 程序的文件描述符。
index 为程序数组中需要调用的 eBPF 程序索引。

2 如何使用尾调用?

关于 BCC 框架,reference_guide.md 给出了一个例子。见 27.map.call()

内核态程序:

// example.c
BPF_PROG_ARRAY(prog_array, 10); // A)定义程序数组

int tail_call(void *ctx) {
bpf_trace_printk("Tail-call\n");
return 0;
}

int do_tail_call(void *ctx) {
bpf_trace_printk("Original program\n");
prog_array.call(ctx, 2); // B)调用 ID 为 2 的函数
return 0;
}

用户态程序:

b = BPF(src_file="example.c")
tail_fn = b.load_func("tail_call", BPF.KPROBE) # C)尾调用函数定义
prog_array = b.get_table("prog_array")
prog_array[c_int(2)] = c_int(tail_fn.fd) # D)绑定尾调用函数
b.attach_kprobe(event="some_kpr

标签:总结,12,eBPF,tail,调用,call,prog,array
From: https://www.cnblogs.com/lmyy/p/17966495

相关文章

  • 1月11日总结
    在最近的开发中,一星期内遇到了两个类似的需求:返回组装好的部门树、返回组装好的地区信息树,最终都需要返回List集合对象给前端。于是在经过需求分析和探索实践后,我对于这种基于Stream和List结构的父、子树形结构的操作有了新的认识,现在拿出来和大家作分享交流。一般来说完......
  • 1月10日总结
    在组织结构:团队成员40人左右,业务特点:有大量老服务、流量波动大(峰值集中在中午和傍晚)、流量不可预测。背景:以业务发展为主,对稳定性关注较少,各项目使用的规范和工具不一致,两年台出了几次事故,开始重视稳定性建设,成立稳定性保障小组,推动稳定性工作。稳定性小组的组成:img稳定性保障......
  • 1月15日总结
    好呀,我是歪歪。Spring的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽。但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻,但是最终了解到Spring有一个优雅的解决方案,然后去了解了一下,感觉有点意思。和你一......
  • 1月14日总结
    果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle、AspectCore和DoraInterception,我将从我当时研究的经历,以及我遇到的场景,为大家展示下聊一聊我为什么要费时费力的整合Microsoft.Extensions.DependencyInjection和Castle.Core当时遇到的场景直接上源码public......
  • MySQL-12.MySQL数据类型
    1.MySQL中的数据类型常见数据类型的属性,如下2.整数类型2.1类型介绍整数类型一共有5种,包括TINYINT,SMALLINT,MEDIUMINT,INT(INTEGER)和BIGINT。它们的区别如下表所示2.2可选属性整数类型的可选属性有三个2.2.1MM:显示宽度,M的取值范围是(0,255)。例如,int(5):当数据宽度小......
  • 微信小程序测试点,9大方面全方位总结
    微信小程序无需下载安装,用户在微信扫一扫或搜索即可使用,小程序版本类型可分为:开发版、体验版、正式版。开发版、体验版无需审核,只需要给微信号权限,经过扫小程序的二维码就能访问,正式版本需要经过微信审核才可使用。下面从9个方面,总结下微信小程序的测试点:1、功能:与Web和App......
  • MySQL常规(总结)
    1.exist和in的区别1.1select*fromA whereidin(selectidfromB)in 先查询子表,再查询主表,不管子查询是否有数据,但是in只执行一次,查出B表中的所有id字段并缓存起来,检查A表的id是否与B表中的id相等,直到遍历完A表所有记录,所以当子查询数据较大时不适合使用in,因为它会将子......
  • 4412 设备树 qt busybox , ctrl+c 无法终止 程序
    问题: 在系统中,ctrl+c无法终止程序。背景: 软件:迅为网盘设备树镜像。硬件:迅为4412板卡。  网上的截图:   我自己的改动如下;     结果显示: ......
  • CodeForces 1266F Almost Same Distance
    洛谷传送门CF传送门好厉害。特判\(k=1\)。首先经过观察,我们可以按照\(k\)的奇偶性讨论:\(k\)为偶数,有一个中心点挂了若干条长度为\(\frac{k}{2}\)的链。\(k\)为偶数,有两个中心点,两边挂了若干条长度为\(\frac{k}{2}\)的链;\(k\)为奇数,有一个中心点挂了若干条长度......
  • 如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(一)
    作为一个信息系统项目经理,最要紧的就是要明白什么是因地制宜、因势利导,只有最合适的,没有什么叫对的,什么叫错的;最忌讳的就是完美主义倾向,凡事都要寻找标准答案和最优答案,既耽误了项目进度,也迷茫了自己。以下是本人一些做信息系统项目的个人体会和经验总结,写出来供大家指点,在讨论过......