我对eBPF完全陌生,我试图找到答案,但无法找到,所以我希望得到一些帮助。
以Liz的ebpf.py为例
它看起来像这样:
BPF_HASH(clones);
int hello_world(void *ctx) {
u64 uid;
u64 counter = 0;
u64 *p;
uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;
p = clones.lookup(&uid);
if (p != 0) {
counter = *p;
}
counter++;
clones.update(&uid, &counter);
return 0;
}
这让我想知道,对于名为克隆的地图,她调用了更新方法。她输入一个指向堆栈分配变量(计数器(的指针,当堆栈帧被释放时,这不会导致未定义的行为。
一种可能的选择是复制指针中的值,而不是将其存储为指针。
但是,根据本参考指南,BPF_HASH可以指定leaf_type(贴图的值(。这意味着你可以将它设置为一个结构,而不一定可以复制。
我觉得我错过了什么,所以我很感谢对此事的任何解释。
一个可能的选项是复制指针中的值,而不是将其存储为指针。
没错。指针指向的值被复制到为映射值分配的内存缓冲区中。
这意味着你可以将其设置为一个结构,而不一定可以复制。
为什么这不可能?请注意,内核并不真正关心它是一个结构体。它看到一个指向内存缓冲区的指针,该缓冲区具有一个大小(映射的值大小(;它只是将该缓冲区中的任何内容复制到为映射值分配的内存缓冲区中。