【问题标题】:Can struct type be value of bpf hash map?结构类型可以是 bpf 哈希映射的值吗?
【发布时间】: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 的解决方案不起作用。你能分享完整的程序和验证者的完整日志吗?

标签: hashmap ebpf bpf


【解决方案1】:

关于您的错误:如果您尝试使用堆栈中未初始化的日期更新地图,验证程序会拒绝您的程序,这就是您创建值时发生的情况。

尝试初始化整个结构:

struct my_value e;
memset(&e, 0, sizeof(e));
e.pages= 10;

关于你的第二个问题:你可以从你的 eBPF 程序调用 eBPF helpers,你可以调用 a very few white-listed functions from the kernel,但是你现在不能从内核调用任何函数。不过,一些不依赖于内核内部的函数可能会在您的程序中重新实现。

【讨论】:

  • 嗨 Qeole,你是对的,它现在可以工作了。错误是另一个错误,不是因为更新。谢谢。
猜你喜欢
  • 2020-07-27
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多