标签: libbpf

bpf_probe_read_user() 在 ebpf 程序中抛出“权限被拒绝:对映射值的访问无效”

kretprobe/sys_read探测器中,我尝试读取 BPF_MAP_TYPE_ARRAY 中的请求缓冲区(用户空间)。eBPF 验证程序抛出以下错误:

{"error": "field SyscallProbeRetRead: program syscall__probe_ret_read: load program: permission denied: invalid access to map value, value_size=70 off=0 size=16383: R1 min value is outside of the allowed memory range (truncated, 73 line(s) omitted)"}
Run Code Online (Sandbox Code Playgroud)

逻辑:如果 buf_size 大于MAX_MSG_SIZE,那么我们将读取TRACE_PARENT_SIZE或更少(取决于缓冲区的大小)到seventy_bytes_array->data,否则,我们将不会读取任何内容。

#define MAX_MSG_SIZE 16383 
#define TRACE_PARENT_SIZE 70

SEC("kretprobe/sys_read")
int syscall__probe_ret_read(struct pt_regs *ctx)
{
    size_t buf_size = PT_REGS_RC(ctx);
    u64 id = bpf_get_current_pid_tgid();
    struct data_args_t *read_args = bpf_map_lookup_elem(&active_read_args_map, &id);

    if (read_args)
    {
        char *buf = read_args->buf; …
Run Code Online (Sandbox Code Playgroud)

c bpf ebpf libbpf

5
推荐指数
0
解决办法
108
查看次数

XDP 上的线程安全操作

我可以从文档中确认,如果在 HASH_MAP 上完成,bpf_map_update_elem 是一个原子操作。来源(https://man7.org/linux/man-pages/man2/bpf.2.html)。[引用:map_update_elem() 以原子方式替换现有元素]

我的问题是2倍。

  1. 如果元素不存在怎么办,map_update_elem 仍然是原子的吗?

  2. XDP 操作 bpf_map_delete_elem 线程在用户空间程序中安全吗?

该映射是 HASH_MAP。

bpf ebpf xdp-bpf xdp-ebpf libbpf

3
推荐指数
1
解决办法
915
查看次数

如何使 eBPF 程序休眠

我一直在阅读有关可休眠 eBPF 程序的内容,特别是这篇文章提供了很好的介绍。然而,我正在努力寻找任何有关如何在代码中实际实现这一目标的文档或示例。非常感谢任何提示或文档链接。

linux linux-kernel bpf ebpf libbpf

3
推荐指数
1
解决办法
484
查看次数

标签 统计

bpf ×3

ebpf ×3

libbpf ×3

c ×1

linux ×1

linux-kernel ×1

xdp-bpf ×1

xdp-ebpf ×1