其他分享
首页 > 其他分享> > eBPF学习笔记(一)概述

eBPF学习笔记(一)概述

作者:互联网

eBPF技术简述
       eBPF 是起源于内核的革命性技术,从 2011 年开发至今,eBPF 社区依然非常活跃 。eBPF 可以通过热加载的sandbox程序到内核中而不需要insmod module的方式,避免内核模块的方式可能会引入宕机风险,并具备堪比原生代码的执行效率。eBPF程序不会引起系统宕机,Just-In-Time (JIT) compiler编译器假设代码是安全但有 verification engine从汇编语言级别检查程序的有效性,程序中规定了内存范围、有限的循环、bpf_spin_lock()不会死锁、不可以在free之后使用、不可以有内存泄露等。
使用eBPF技术可以应用在很多场景中:

等等,可能性是无限的。

 eBPF架构图

图1 简易的eBPF程序架构图

图1是一个简易的eBPF程序架构图,它描述了一个eBPF程序的主要构成部分和程序编译、运行顺序。先来看一个eBPF程序的主要构成部分:

1. 用户空间的BPF字节码:图1中用户空间绿色的部分,用户空间的BPF程序,文件名一般是xxx.bpf.c,由该文件生成BPF字节码

2. 用户空间的程序代码:图1中用户空间紫色的部分,表述从内核获取数据后的处理逻辑。当程序挂载的系统调用被触发,就会把相应的事件数据传输到perf_event data中,由用户空间的代码来分析行为。

3. 内核空间的verifier: 验证器确保了eBPF程序可以安全运行。它验证程序是否满足几个条件,例如:

4. 内核空间的JIT Compiler:即时(JIT)编译步骤将程序的通用字节码转换为特定于机器的指令集,以优化程序的执行速度。这使得eBPF程序可以像本地编译的内核代码或作为内核模块加载的代码一样高效地运行。

5. 内核空间的BPF沙箱程序:这是整个程序的核心部分,BPF程序可以被挂载到多种系统点:kprobe、uprobe、tracepoint和perf_events. 至于你关注的系统调用属于那种系统hook点,可以用 bpftrace -l 命令来查询。当程序挂载的系统调用被触发,就会把相应的事件数据传输到perf_event data中.

6. 内核空间的MAPS:eBPF非常重要的能力是能分享收集到的信息并存储状态。为了达到这个目的,eBPF使用maps来存储数据。这些数据可以是各种各样的struct. Maps中的数据可以被用户空间的程序通过系统调用读取。

 然后再来看一个eBPF程序的主要流程: 

1. 编写BPF代码,生成字节码

2. 加载BPF字节码到内核上

3. 异步读取maps数据

4. 系统事件触发,用户空间接收到事件信息开始处理分析逻辑

 eBPF开发工具链

eBPF程序开发常使用的方法分为bcc、bpftrace、eBPF Go Library和libbpf. 

 以上四种方法只是书写eBPF程序和生成eBPF字节码的方式不同,也就是图1的第一个步骤不同,其他的都是一致的。

 

标签:字节,eBPF,BPF,程序,笔记,概述,内核,加载
来源: https://www.cnblogs.com/janeysj/p/16185097.html