minimal
- bpf程序,这一代码会被加载进bpf虚拟机,由事件触发执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <linux/bpf.h> #include <bpf/bpf_helpers.h>
char LICENSE[] SEC("license") = "Dual BSD/GPL";
int my_pid = 0;
SEC("tp/syscalls/sys_enter_write") int handle_tp(void *ctx) { int pid = bpf_get_current_pid_tgid() >> 32;
if (pid != my_pid) return 0;
bpf_printk("BPF triggered from PID %d.\n", pid);
return 0; }
|
- 用户空间代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <stdio.h> #include <unistd.h> #include <sys/resource.h> #include <bpf/libbpf.h> #include "minimal.skel.h"
static int libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args) { return vfprintf(stderr, format, args); }
int main(int argc, char **argv) { struct minimal_bpf *skel; int err;
libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn);
skel = minimal_bpf__open(); if (!skel) { fprintf(stderr, "Failed to open BPF skeleton\n"); return 1; }
skel->bss->my_pid = getpid();
err = minimal_bpf__load(skel); if (err) { fprintf(stderr, "Failed to load and verify BPF skeleton\n"); goto cleanup; }
err = minimal_bpf__attach(skel); if (err) { fprintf(stderr, "Failed to attach BPF skeleton\n"); goto cleanup; }
printf("Successfully started! Please run `sudo cat /sys/kernel/debug/tracing/trace_pipe` " "to see output of the BPF programs.\n");
for (;;) { fprintf(stderr, "."); sleep(1); }
cleanup: minimal_bpf__destroy(skel); return -err; }
|
bpf Spinlocks
https://libbpf.readthedocs.io/en/latest/program_types.html
https://libbpf.readthedocs.io/en/latest/program_types.html
spinglock目前无法用于tracking和sccket filter相关ELF

https://www.edony.ink/deepinsight-of-ebpf-map/