【80页】eBPF学习笔记1

preview
需积分: 0 23 下载量 98 浏览量 更新于2022-08-03 2 收藏 1.25MB PDF 举报
【eBPF学习笔记1】 eBPF,全称Extended Berkeley Packet Filter,起源于Berkeley Packet Filter,是一个在Linux内核中用于定制网络封包处理逻辑的机制。自Linux 3.18版本开始,eBPF成为BPF的主要形态,引入了一系列增强特性,使其超越了原始的网络过滤功能,成为了一个通用的内核扩展框架。 1. **eBPF的增强特性**: - **通用的RISC指令集**:eBPF拥有11个64位寄存器(32位子寄存器),r0-r10,以及512字节的栈空间。 - **JIT编译**:通过Just-In-Time技术,将eBPF程序编译为目标架构的机器码,提高了执行效率。 - **解耦网络子系统**:eBPF程序可挂接到Kprobe、Tracepoint等,不仅限于网络处理。 - **Maps**:键值存储结构,用于不同eBPF程序间的状态共享。 - **助手函数**:提供如封包改写、Checksum计算等功能。 - **尾调用**:通过尾调用来实现程序间的控制转移,突破程序长度限制。 - **Pin对象**:通过伪文件系统固定对象,方便持久化和访问。 - **硬件Offload支持**:支持将eBPF程序交给智能硬件执行。 2. **应用领域**: - **网络处理**:XDP、TC、socket progs、kcm、calico、cilium等。 - **内核跟踪和性能监控**:KProbes、UProbes、TracePoints。 - **安全领域**:Secomp、landlock等,用于限制系统调用。 3. **性能优势**: - **内核执行**:避免用户空间和内核空间的上下文切换。 - **编译优化**:助手函数内联,减少函数调用开销。 4. **安全性**: - **BPF校验器**:确保字节码的安全性,防止内核崩溃或锁定。 5. **灵活性**: - **动态注入和卸载**:程序无需重启内核或中断网络服务。 - **跨架构移植**:eBPF程序可在不同硬件平台间迁移。 6. **执行流程**: - **开发阶段**:使用Clang将C代码编译为eBPF object文件。 - **加载阶段**:用户空间加载object文件,经过校验和JIT编译。 - **执行阶段**:挂钩到内核的特定点,如网络事件、系统调用等。 - **数据交换**:通过BPF Maps在用户空间和内核间传递数据。 7. **挂钩点**: - **网络事件**:如封包到达。 - **Kprobes/Uprobes**:跟踪内核函数调用。 - **系统调用**:监控系统调用行为。 - **函数入口/退出**:在特定函数执行前后执行eBPF程序。 8. **BPF Verifier**: - **控制流检查**:防止循环。 - **边界检查**:检测非法跳转。 - **Context访问**:跟踪上下文访问。 - **指针泄漏检查**:防止非特权指针泄露。 - **助手函数调用检查**:验证参数合法性。 9. **BPF JITs**: - **JIT编译**:将字节码转化为机器码,提高执行效率。 10. **BPF Maps**: - **键值对**:存储共享数据,通过文件描述符访问。 - **Pinning**:通过固定文件系统位置,实现持久化和跨进程共享。 eBPF的这些特性使得它在现代Linux系统中扮演着越来越重要的角色,成为了一种强大的工具,广泛应用于性能分析、网络安全、系统监控等多个领域。