【eBPF】常见的 eBPF 程序类型和 ctx 类型对应表

在开发ebpf程序的时候如何确定ctx上下文的类型呢?

Kprobe 和 Kretprobe

  • ctx 类型struct pt_regs *
  • 说明:在 kprobekretprobe 程序中,ctxstruct pt_regs * 类型,表示寄存器上下文。可以通过 ctx 访问被监控函数的参数或返回值。
  • 示例:
SEC("kprobe/sys_execve")
int bpf_prog(struct pt_regs *ctx) {
  u64 pid = bpf_get_current_pid_tgid();
  // 从 ctx 中获取寄存器数据
  return 0;
}

Tracepoint

  • ctx 类型:根据具体的 tracepoint 事件,ctx 类型会是与事件定义相对应的 struct
  • 说明:每个 tracepoint 都有一个特定的上下文结构,通常可以在 /sys/kernel/debug/tracing/events/中找到。例如,sys_enter_execvectx 类型是 struct trace_event_raw_sys_enter
  • 示例:
SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(struct trace_event_raw_sys_enter *ctx) {
  u64 pid = bpf_get_current_pid_tgid();
  // 使用 tracepoint 特定的字段
  return 0;
}

XDP

  • ctx 类型struct xdp_md *
  • 说明:在 XDP 程序中,ctxstruct xdp_md * 类型,用于访问网络数据包的元数据和数据指针。
  • 示例:
SEC("xdp")
int bpf_prog(struct xdp_md *ctx) {
  // 从 ctx 中获取数据包信息
  return XDP_PASS;
}

Socket Filter

  • ctx 类型struct __sk_buff *
  • 说明:在 socket filter 程序中,ctxstruct __sk_buff *,提供对 socket 缓冲区的访问。
  • 示例:
SEC("socket")
int bpf_prog(struct __sk_buff *ctx) {
  // 访问 socket 缓冲区中的数据
  return 0;
}

Perf Event

  • ctx 类型struct bpf_perf_event_data *
  • 说明:在 perf event 程序中,ctxstruct bpf_perf_event_data * 类型,允许访问性能事件的相关信息。
  • 示例:
SEC("perf_event")
int bpf_prog(struct bpf_perf_event_data *ctx) {
  // 访问性能事件数据
  return 0;
}

    eBPF如何确定特定 Tracepoint 的ctx类型

    对于 tracepoint 类型的程序,可以通过以下方法找到具体的 ctx 类型:

    1. 查看内核源码:在内核源码中,tracepoint 定义的文件通常位于 include/trace/events/ 中。例如,sys_enter_execve 事件的上下文结构可以在 syscalls.h 中找到。
    2. 查看 /sys/kernel/debug/tracing/events:在系统运行时,可以在 /sys/kernel/debug/tracing/events/ 中找到每个 tracepoint 的字段定义。

    留下评论