加餐05 | eBPF:怎么更加深入地查看内核中的函数?
李程远
该思维导图由 AI 生成,仅供参考
你好,我是程远。
今天这一讲,我们聊一聊 eBPF。在我们专题加餐第一讲的分析案例时就说过,当我们碰到网络延时问题,在毫无头绪的情况下,就是依靠了我们自己写的一个 eBPF 工具,找到了问题的突破口。
由此可见,eBPF 在内核问题追踪上的重要性是不言而喻的。那什么是 eBPF,它的工作原理是怎么样,它的编程模型又是怎样的呢?
在这一讲里,我们就来一起看看这几个问题。
eBPF 的概念
eBPF,它的全称是“Extended Berkeley Packet Filter”。从名字看,你可能会觉奇怪,似乎它就是一个用来做网络数据包过滤的模块。
其实这么想也没有错,eBPF 的概念最早源自于 BSD 操作系统中的 BPF(Berkeley Packet Filter),1992 伯克利实验室的一篇论文 “The BSD Packet Filter: A New Architecture for User-level Packet Capture”。这篇论文描述了,BPF 是如何更加高效灵活地从操作系统内核中抓取网络数据包的。
我们很熟悉的 tcpdump 工具,它就是利用了 BPF 的技术来抓取 Unix 操作系统节点上的网络包。Linux 系统中也沿用了 BPF 的技术。
那 BPF 是怎样从内核中抓取数据包的呢?我借用 BPF 论文中的图例来解释一下:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
eBPF技术在Linux系统中发挥着重要作用,为网络处理、安全领域和内核追踪/调试提供了强大的扩展接口。本文详细介绍了eBPF的概念、编写、编译和运行过程,以及其核心要素:eBPF Program Types、eBPF Maps和eBPF Helpers。通过示例代码和操作步骤,读者可以了解eBPF的工作原理和编程模型。在用户态部分,通过加载eBPF bytecode并读取BPF Maps的值,实现了对内核中kill()系统调用的截获和信息传递。总之,本文为读者提供了深入了解eBPF技术的指导,使其能够快速掌握eBPF的核心概念和应用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》,新⼈⾸单¥59
《容器实战高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- 小李同学老师,有没有能跑在arm64板子上的bpf用例,我用最简单的hello word测试用例,5.4的内核,报各种错误,都快怀疑是不是不能跑在atm64上
作者回复: eBPF 肯定是可以跑在ARM64上的。 我这里没有arm64的环境,不过你可以先检查一下内核中的BPF相关编译参数,也可以尝试一下bcc的工具,然后在bcc github中提问。
2021-03-044 - 好说老师,ebpf-kill-example编译后执行会有下面的报错,是内核少开启了什么吗? libbpf: sec 'tracepoint/syscalls/sys_enter_kill': failed to find program symbol at offset 0 The kernel didn't load the BPF program
作者回复: 这个出错信息应该是libbpf库里出来的。 我发现 https://github.com/niclashedam/ebpf-kill-example/commits/master, 里最近有很多的更新。 你可以用我课程中老版本的代码,可以在我fork的repo中拿到,https://github.com/chengyli/ebpf-kill-example.git 在这里libbpf是从kernel 5.4 的代码里编译出来的。
2021-02-1321 - Samaritan.加餐的内容很值,非常用心,谢谢老师!2023-10-09归属地:福建
- janey请问下,Clang/LLVM编译成 foo_kern.o文件再加载到内核中由BPF Verifier进行指令检查然后再由JIT编译成宿主机上的本地指令。这个过程中每次程序执行一次,这三个步骤都要走一遍吗?还是说会只需要做一次,当下次执行的时候直接用上次处理好的本地指令就行?2022-11-18归属地:江苏
- JianXu老师,ebpf 和 iptables 里面的hook 最本质的区别是什么呢?2022-08-27归属地:上海
收起评论