【发布时间】:2022-01-17 15:03:31
【问题描述】:
我希望 bpf 哈希映射中的值是一个结构,但它不起作用。谁知道BPF是否允许这样做?像打击一样的代码。
另外,我还有第二个问题,如何在bpf程序中调用内核函数?
typedef struct my_value {
u64 ts;
unsigned char opcode;
unsigned int pages;
pid_t pid;
} MY_VAL;
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 8192);
//__type(key, pid_t);
__type(key, u64);
__type(value, MY_VAL);
} _start SEC(".maps");
当我使用时
struct my_value e;
e.pages= 10;
u64 pate = 0x456;
bpf_map_update_elem(&_start, &pate, &e, BPF_ANY);
有错误:
79:(85) 调用 bpf_map_update_elem#2 无效的间接从堆栈读取 -32+0 大小 8 已处理 51 个 insn(限制 1000000) max_states_per_insn 0 total_states 3 peak_states 3 mark_read 1
【问题讨论】:
-
“它不起作用”到底是什么意思?您是否尝试过不将其定义为 typedef?
-
是的,它应该可以工作。你得到什么错误信息?至于调用内核函数,你不能只使用 any 函数,但你可以从你的程序中调用一个可用的 bpf 帮助器,参见this page 获取一些文档,或者查找示例,例如
bpf_map_update_elem()或bpf_trace_printk(). -
@Qeole 我想调用一个不在bpf helper中的函数,但是在Linux内核中,它是外部的,例如get_unaligned_be32().,如何调用这种内核功能??
-
@pchaigno bpf_map_update_elem(&_start, &pate, &e, BPF_ANY);将失败。你知道怎么更新吗?
-
我很惊讶 Qeole 的解决方案不起作用。你能分享完整的程序和验证者的完整日志吗?