libbpf中我们常用的bpf_core_read其实就是对上诉两个函数的封装。 #definebpf_core_read(dst, sz, src) \ bpf_probe_read_kernel(dst, sz, (const void *) \ __builtin_preserve_access_index(src)) \ #define__CORE_RELO(src, field, info) \ __builtin_preserve_field_info((src)->field, BPF_...
为了实现这一覆盖,我们需要存储我们想要覆盖的地址(即core_pattern减去struct_bpf_array_offset的结果)。接下来,我们使用update_elem函数来更新array_of_maps,从而实现对core_pattern的修改。为了完成这一操作,我们需要创建另一个bpf程序,并利用它来修改索引0位置的arraymap,这样core_pattern就会被新的值所覆盖。...
2、BPF CORE:基于 libbpf 自己编写的 bpf_core_read 代码,开发机生成对应目标机的二进制程序。该方式不依赖在环境中部署 Clang/LLVM ,资源占用少。但是需要搭建编译工程,部分代码相对固定,无法动态配置。 3、BCC:基于应用最广的开源项目,开发效率较高。但是每一次运行都要执行 Clang/LLVM 编译,存在内存、CPU 等资...
#include <linux/bpf.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> #include <bpf/bpf_core_read.h> #include <linux/ptrace.h> // 内核的动态插桩位置:do_sys_openat2 即打开文件函数 SEC("kprobe/do_sys_openat2") int hello(struct pt_regs *ctx) { const int dirfd = PT...
2、BPF CORE:基于 libbpf 自己编写的 bpf_core_read 代码,开发机生成对应目标机的二进制程序。该方式不依赖在环境中部署 Clang/LLVM ,资源占用少。但是需要搭建编译工程,部分代码相对固定,无法动态配置。 3、BCC:基于应用最广的开源项目,开发效率较高。但是每一次运行都要执行 Clang/LLVM 编译,存在内存、CPU 等资...
u64 inode = task->mm->exe_file->f_inode->i_ino;u64 inode = BPF_CORE_READ(task, mm, exe_file, f_inode, i_ino); 2)map fd、全局变量、extern 等重定位,这部分主要依赖于 ELF 重定位机制。通过查找 ELF 重定位段收集重定位信息,更新相应指令的 imm 字段。
u64 inode = BPF_CORE_READ(task, mm, exe_file, f_inode, i_ino); 1. 2. 复制 2)map fd、全局变量、extern 等重定位,这部分主要依赖于 ELF 重定位机制。通过查找 ELF 重定位段收集重定位信息,更新相应指令的 imm 字段。 skel->rodata->my_cfg.feature_enabled = true; ...
u64 inode = BPF_CORE_READ(task, mm, exe_file, f_inode, i_ino); 2)map fd、全局变量、extern 等重定位,这部分主要依赖于 ELF 重定位机制。通过查找 ELF 重定位段收集重定位信息,更新相应指令的 imm 字段。 skel->rodata->my_cfg.feature_enabled = true; ...
1、内核自带示例代码:基于内核 samples/bpf 示例代码,无 CORE。该方式没有任何基于第三方的开源项目,资源占用量低。但缺点是需要自己完全重新搭建工程,效率较低,且版本兼容性较差。 2、BPF CORE:基于 libbpf 自己编写的 bpf_core_read 代码,开发机生成对应目标机的二进制程序。该方式不依赖在环境中部署 Clang/LLVM...
... e->exit_event = false; e->pid = pid; e->ppid = BPF_CORE_READ(task, real_parent, tgid); bpf_get_current_comm(&e->comm, sizeof(e->comm)); /* successfully submit it to user-space for post-processing */ bpf_ringbuf_submit(e, 0); return 0; } eunomia-bpf 会自动去源...