微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BPF:如何将跳转值设置为累加器中存储的值?

如何解决BPF:如何将跳转值设置为累加器中存储的值?

我正在使用 seccomp BPF,需要将跳转语句(条件跳转/始终跳转)的跳转值 (jt/jf/k) 设置为存储的值在蓄能器中。这可能吗?我有一种预感,它不是,因为 BPF 验证器无法在加载过滤器之前检查跳转值。如果没有,是否有任何解决方法

struct sock_filter filter = 
  {
    BPF_STMT(BPF_LD | BPF_W | BPF_ABS,offsetof(struct seccomp_data,nr)),BPF_STMT(BPF_JMP | BPF_JA,/* Value stored in the accumulator */),...
  }

我尝试寻找 here,但我想不出任何方法。我对 BPF 的了解也很初级,只在 seccomp 的范围内。你能帮助我吗?感谢您抽出宝贵时间。

解决方法

不,BPF 不支持间接分支指令。 seccomp-bpf 和 eBPF 中使用的 cBPF 都没有。


在 cBPF 的情况下,您可以在 the documentation 中检查。您将看到指令定义为:

struct sock_filter { /* Filter block */
    __u16   code;    /* Actual filter code */
    __u8    jt;      /* Jump true */
    __u8    jf;      /* Jump false */
    __u32   k;       /* Generic multiuse field */
};

其中 jtjfk 可以解释为跳转偏移量,具体取决于所使用的特定跳转指令。在所有情况下,它们都被解释为立即数而不是寄存器号:

   6               L                    Jump label L
   7               #k,Lt,Lf             Jump to Lt if true,otherwise jump to Lf
   8               x/%x,Lf           Jump to Lt if true,otherwise jump to Lf
   9               #k,Lt                Jump to Lt if predicate is true
  10               x/%x,Lt              Jump to Lt if predicate is true

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。