Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在使用BPF\u MAP\u TYPE\u队列时BPF验证器出现空密钥错误?_C_Bpf_Ebpf - Fatal编程技术网

C 为什么在使用BPF\u MAP\u TYPE\u队列时BPF验证器出现空密钥错误?

C 为什么在使用BPF\u MAP\u TYPE\u队列时BPF验证器出现空密钥错误?,c,bpf,ebpf,C,Bpf,Ebpf,我正在尝试加载带有队列映射的BPF程序。似乎我得到了一个与空键相关的错误 libbpf: -- BEGIN DUMP LOG --- libbpf: 0: (b7) r1 = 123 1: (63) *(u32 *)(r10 -4) = r1 2: (bf) r3 = r10 3: (07) r3 += -4 4: (18) r1 = 0xffff9df655207800 6: (b7) r2 = 0 7: (b7) r4 = 0 8: (85) call bpf_map_update_ele

我正在尝试加载带有队列映射的BPF程序。似乎我得到了一个与空键相关的错误

libbpf: -- BEGIN DUMP LOG ---
libbpf: 
0: (b7) r1 = 123
1: (63) *(u32 *)(r10 -4) = r1
2: (bf) r3 = r10
3: (07) r3 += -4
4: (18) r1 = 0xffff9df655207800
6: (b7) r2 = 0
7: (b7) r4 = 0
8: (85) call bpf_map_update_elem#2
R2 type=inv expected=fp
processed 8 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0

libbpf: -- END LOG --
BPF计划

#include <bpf/bpf.h>
#include <string.h>

struct bpf_map SEC("maps") queue_map = {
  .type = BPF_MAP_TYPE_QUEUE,
  .key_size = 0,
  .value_size = sizeof(int),
  .max_entries = 100,
  .map_flags = 0,
};

SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx) {

  int value;
  value = 123;
  bpf_map_update_elem(&queue_map, NULL, &value, BPF_ANY);

  return 0;
}

char _license[] SEC("license") = "GPL";
是什么导致了错误? 我正在使用/tools/perf中的头文件。我应该使用不同的头文件吗? 我是否需要以不同于数组映射的方式加载队列映射? 是否需要为队列映射添加映射标志?
验证器会抱怨,因为它希望第二个参数有一个指针指向bpf_map_update_elem fp for frame pointer,而您的参数为NULL。但是正如pchaigno提到的,它对队列映射无效;我不认为它会做什么,我相信它不会通过被拒绝的验证器,如果你能以某种方式通过这个指针错误

对于要使用bpf|u map|u push | pull | peek|元素的队列或堆栈

关于你的其他问题:

不确定您特别使用了什么标题。我想这取决于你需要什么定义

您以相同的方式创建映射,但使用不同的帮助程序对其进行不同的更新,如上所述-这就是使用队列而不是数组的意义所在

不,我认为创建地图不需要特定的标志


我很惊讶这对数组映射有效。是您唯一更改此行的内容:.type=BPF\u MAP\u type\u QUEUE,?还要注意,bpf_map_update_elem不是队列映射的有效助手;它将不执行任何操作并返回一个非零错误代码。@pchaigno除了.type=BPF\u MAP\u type\u队列之外,我还更新了.key\u size=sizeofint,并为BPF\u MAP\u update\u elem函数提供了一个有效的密钥。我会更新这个问题,让它更清楚。我更新了程序以使用bpf_map_push_元素,程序按预期加载和工作!谢谢你的帮助。我引用了一个过时的队列映射示例。我可以通过更新bpf_map_update_elem&queue_map,NULL,&value,bpf_ANY来加载程序;到bpf\u映射\u推送\u元素和队列\u映射和值,bpf\u任意;并将该原型添加到文件static int*bpf\u map\u push\u elemvoid*map,const void*value,unsigned long long flags=void*bpf\u FUNC\u map\u push\m;
int bpf_prog_test_load(const char *file, enum bpf_prog_type type,
                       struct bpf_object **pobj, int *prog_fd)
{
  struct bpf_prog_load_attr attr;

  memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
  attr.file = file;
  attr.prog_type = type;
  attr.expected_attach_type = 0;

  return bpf_prog_load_xattr(&attr, pobj, prog_fd);
}