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_...
2.1bpf_probe_read 语法:int bpf_probe_read(void *dst, int size, const void *src) 如果成功返回0. 该函数将内容复制到BPF栈中,用于后续使用。为了安全起见,所有内存读取都通过bpf_probe_read函数。 2.2bpf_probe_read_str 语法:int bpf_probe_read_str(void *dst, int size, const void *src) 复制NU...
语法:int bpf_probe_read(void *dst, int size, const void *src) 如果成功返回0. 该函数将内容复制到BPF栈中,用于后续使用。为了安全起见,所有内存读取都通过bpf_probe_read函数。 2.2bpf_probe_read_str 语法:int bpf_probe_read_str(void *dst, int size, const void *src) 复制NULL结尾的字符串到BPF...
bpf_core_read()是一个简单的宏,它会将所有的参数直接传递给bpf_probe_read(),但也会使Clang通过__builtin_preserve_access_index()记录第三个参数(&task->pid)的字段的偏移量。 bpf_probe_read(&pid, **sizeof**(pid), __builtin_preserve_access_index(&task->pid)); 但像bpf_probe_read()/bpf_...
bpf_get_current_comm(&e->comm,sizeof(e->comm));bpf_probe_read_str(&e->filename,sizeof(e->filename),(void*)ctx+fname_off);-bpf_perf_event_output(ctx,&pb,BPF_F_CURRENT_CPU,e,sizeof(*e));+bpf_ringbuf_output(&rb,e,sizeof(*e),0);return0;} ...
probe_read_kernel_str: yes get_current_cgroup_id: yes send_signal: yes override_return: yes Kernel features Instruction limit: -1 Loop support: no btf: no Map types hash: yes percpu hash: yes array: yes percpu array: yes stack_trace: yes ...
内核的 BTF 除了被内核自身使用, 现在还用于增强 BPF 校验器自身的能力 —— 某些能力甚至超越了一年之前我们的想象力所及(例如,已经有了直接读取内核内存的能力,不再需要通过bpf_probe_read()间接读取了)。 更重要的是,内核已经将这个自描述的权威 BTF 信息(定义结构体的精确内存布局等信息)通过 sysfs 暴露出来...
As was discussed at LSFMM, bpf_probe_read() may be split in the future into bpf_probe_read_kernel() and bpf_probe_read_user(), to support other architectures (like SPARC) where the kernel/user address space overlaps, and the pointer isn'...
bpf_probe_read_user_str(&event.fname,sizeof(event.fname), ap->fname); event.flags = ap->flags; event.ret = ret; /* emit event */ bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event,sizeof(event)); cleanup:
e = bpf_map_lookup_elem(&heap, &zero);if (!e) /*can't happen */return 0;e->pid = bpf_get_current_pid_tgid() >> 32;bpf_get_current_comm(&e->comm, sizeof(e->comm));bpf_probe_read_str(&e->filename, sizeof(e->filename), (void *)ctx + fname_off);// 发送事件,...