容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

加餐05 | eBPF:怎么更加深入地查看内核中的函数?

在函数的进程所对应的进程号打印出来
每个例子都有两个.c文件,分别是xxx_kern.c和xxx_user.c
例子位于samples/bpf目录下,包含了eBPF各种使用场景
BPF Helpers
BPF Maps
BPF Program Types
用户态代码负责加载内核态代码,以及从内核态代码运行后通过eBPF maps读取数据
内核部分的代码需要被编译成eBPF bytecode,需要使用Clang/LLVM编译器
eBPF程序分为内核态代码和用户态代码
内核追踪/调试
安全领域
网络领域
eBPF可以处理更多的内核事件,不再只局限在网络事件上
增加了eBPF maps,一种存储类型,可以保存状态信息并传递给用户态程序
对虚拟机做了增强,扩展了寄存器和指令集的定义,提高了虚拟机的性能
BPF filter模块使用buffer与用户态程序进行通讯,避免内核态与用户态的上下文切换
BPF模块和网络协议栈代码相互独立
内核中实现了一个虚拟机,用户态程序通过系统调用将数据包过滤代码载入内核态虚拟机中运行
eBPF在2014年内核3.18版本上实现,扩展了BPF的功能
在Linux系统中沿用了BPF的技术
1992年伯克利实验室的论文描述了BPF如何抓取网络数据包
源自于BSD操作系统中的BPF
Extended Berkeley Packet Filter
思考题
示例程序
重点要素
编程模型
应用范围
改进
工作原理
概念
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
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 小李同学
    老师,有没有能跑在arm64板子上的bpf用例,我用最简单的hello word测试用例,5.4的内核,报各种错误,都快怀疑是不是不能跑在atm64上

    作者回复: eBPF 肯定是可以跑在ARM64上的。 我这里没有arm64的环境,不过你可以先检查一下内核中的BPF相关编译参数,也可以尝试一下bcc的工具,然后在bcc github中提问。

    2021-03-04
    4
  • 好说
    老师,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-13
    2
    1
  • Samaritan.
    加餐的内容很值,非常用心,谢谢老师!
    2023-10-09归属地:福建
  • janey
    请问下,Clang/LLVM编译成 foo_kern.o文件再加载到内核中由BPF Verifier进行指令检查然后再由JIT编译成宿主机上的本地指令。这个过程中每次程序执行一次,这三个步骤都要走一遍吗?还是说会只需要做一次,当下次执行的时候直接用上次处理好的本地指令就行?
    2022-11-18归属地:江苏
  • JianXu
    老师,ebpf 和 iptables 里面的hook 最本质的区别是什么呢?
    2022-08-27归属地:上海
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部