这样,在FENTRY中就可以将ctx作为一个u64 []来获取到被跟踪函数的参数了,相比于要从pt_regs中获取参数的kprobe要方便的多。下面我们还是以该函数为例,来讲解一下对于FEXIT类型的BPF所生成的TRAMPOLINE函数。 push rbpmov rbp, rspsub rsp, 24 // 用于存放函数参数的栈空间push rbx // 保存rbx寄存器mov qword...
/* (2) perf_event的数据处理 */ perf_trace_buf_submit(entry, size, rctx, call->event.type, 1, regs, head, NULL); } kretprobe类型的实现: static void kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri, struct pt_regs *regs) { struct trace_event_call *call =...
typedefstructpt_regs bpf_user_pt_regs_t; 对于x86架构而言bpf_user_pt_regs_t就等价于struct pt_regs结构,也就是Linux中存放寄存器上下文的结构。 2) arm64架构 typedefstructuser_pt_regs bpf_user_pt_regs_t; 对于arm64架构而言,user_pt_regs的定义,以及与上下文寄存器struct pt_regs的关联如下: /*user_...
这里的pt_regs指的是内核中的struct pt_regs结构体,它包含了eBPF程序触发时的参数,记录了中断发生时的寄存器状态。 基于dwarf栈回溯 无fp的应用程序的rbp寄存器不再作为特殊寄存器来存放帧指针,而是作为通用寄存器。这样的话就没办法通过rbp来获取到上一层函数的fp以及返回地址。不过,我们可以通过elf文件中eh_frame段...
data.cpu = PT_REGS_PARM2(ctx); data.type = PT_REGS_PARM1(ctx); data.delayed = PT_REGS_PARM3(ctx); data.stack_id = bpf_get_stackid(ctx, &call_stack, KERN_STACKID_FLAGS); bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data)); ...
data.cpu = PT_REGS_PARM2(ctx); data.type = PT_REGS_PARM1(ctx); data.delayed = PT_REGS_PARM3(ctx); data.stack_id = bpf_get_stackid(ctx, &call_stack, KERN_STACKID_FLAGS); bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data)); ...
data.type = PT_REGS_PARM1(ctx); data.delayed = PT_REGS_PARM3(ctx); data.stack_id = bpf_get_stackid(ctx, &call_stack, KERN_STACKID_FLAGS); bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data));
void do_entry(struct pt_regs *ctx) { struct data_t data = {}; data.ts = bpf_ktime_get_ns(); data.pid = bpf_get_current_pid_tgid() >> 32; data.start = PT_REGS_PARM3(ctx); bpf_get_current_comm(&data.comm, sizeof(data.comm)); ...
int bpf_prog1(struct pt_regs *ctx) { long ptr = PT_REGS_PARM2(ctx); bpf_map_delete_elem(&my_map, &ptr); return 0; } SEC("kretprobe/kmem_cache_alloc_node") int bpf_prog2(struct pt_regs *ctx) { long ptr = PT_REGS_RC(ctx); ...
int bpf_prog1(struct pt_regs *ctx) { char fmt[] = "youyeetoo %s ! "; char comm[16]; bpf_get_current_comm(&comm, sizeof(comm)); bpf_trace_printk(fmt, sizeof(fmt), comm); return 0; } char _license[] SEC("license") = "GPL"; ...