0%

eBPF-学习

引言

eBPF 是 Linux 内核中一个非常灵活与高效的类虚拟机,能够在许多内核hook点安全地执行字节码。eBPF 在将程序附加到内核发生的事件中,每当事件发生,都将触发eBPF程序运行。

原理

eBPF程序是事件驱动的,当内核或应用程序通过某个钩子点(hook point)时触发执行。预定义的钩子包括:系统调用、函数进入/退出、内核跟踪点、网络事件等。

cilium ebpf 使用

项目地址: https://github.com/cilium/ebpf

// 加载提前编译的c语言
objs := bpfObjects{}
if err := loadBpfObjects(&objs, nil); err != nil {
    log.Fatalf("loading objects: %v", err)
}

追踪函数

  • kprobes 内核动态探针
    • 分别是pre_handler、post_handler和fault_handler
  • kretprobe
    • 用于探测函数的返回值以及计算函数执行的耗时。
  • USTD 用户静态探针
    • 用户态预定义静态跟踪,它是用户态下的tracepoints
  • uprobes 用户动态探针
    • 在用户态和内核态的kprobe对应,能实现在函数入口、特定偏移处以及函数返回处进行插桩。
  • tracepoints 内核静态探针
    • 是内核开发人员在内核代码中的埋点,是开发者在内核源代码中散落的一些hook,开发者可以依托这些hook实现相应的追踪代码插入。通常比较稳定:能够保证不同内核版本间的兼容性