内核中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开发),关联过程会更简洁:
- 用户态创建map后,用
bpf_map__fd获取fd; - 通过
bpf_object__find_map_by_name找到BPF程序中的map占位符; - 调用
bpf_map__reuse_fd将用户态的map fd绑定到程序中的map; - 正常加载BPF程序即可。
- 用户态创建map后,用
- 本质上,这个过程是让内核将用户态创建的map实例与BPF程序中的map符号建立绑定,确保程序运行时能直接访问目标map。
内容的提问来源于stack exchange,提问作者Paul Suen
相关产品推荐
相关产品推荐

