You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核中app1的tc eBPF程序如何访问用户态创建的map1?

用户态创建eBPF Map后,内核态TC程序的访问方法

核心逻辑是通过Map的文件描述符(fd)将用户态创建的map关联到内核BPF程序,具体操作步骤如下:

  • 用户态调用bpf(BPF_MAP_CREATE, ...)创建map1后,会得到一个对应的文件描述符map_fd,这个fd是后续关联的核心凭证。
  • 在内核态BPF程序代码中,先声明一个和map1元数据完全匹配的map占位符,比如:
    struct bpf_map_def SEC("maps") map1 = {
        .type = BPF_MAP_TYPE_HASH,  // 必须和用户态创建的map类型一致
        .key_size = sizeof(__u32),
        .value_size = sizeof(__u64),
        .max_entries = 1024,
    };
    
    注意:这里的类型、键值大小、最大条目数必须和用户态BPF_MAP_CREATE时的参数完全相同,否则关联会失败。
  • 加载内核态BPF程序(tc_rx_main)时,通过bpf_attr结构体的prog_load字段传递关联信息:
    • 把用户态拿到的map_fd放入map_fds数组中,同时确保数组索引和BPF程序中map占位符的顺序对应(如果有多个map的话)。
  • 程序加载完成后,内核态的tc_rx_main就可以直接用eBPF Helper函数操作map1了,示例代码:
    SEC("tc")
    int tc_rx_main(__sk_buf* ctx) {
        __u32 key = ctx->ifindex;
        __u64 *value = bpf_map_lookup_elem(&map1, &key);
        if (value) {
            (*value)++;
        }
        return TC_ACT_OK;
    }
    

额外注意事项

  • 如果使用libbpf库(推荐用于eBPF开发),关联过程会更简洁:
    1. 用户态创建map后,用bpf_map__fd获取fd;
    2. 通过bpf_object__find_map_by_name找到BPF程序中的map占位符;
    3. 调用bpf_map__reuse_fd将用户态的map fd绑定到程序中的map;
    4. 正常加载BPF程序即可。
  • 本质上,这个过程是让内核将用户态创建的map实例与BPF程序中的map符号建立绑定,确保程序运行时能直接访问目标map。

内容的提问来源于stack exchange,提问作者Paul Suen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:16:12