gpt4 book ai didi

c - ebpf 的受限 C 中不允许什么?

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:21 29 4
gpt4 key购买 nike

来自 bpf 手册页:

eBPF programs can be written in a restricted C that is compiled (using the clang compiler) into eBPF bytecode. Various features are omitted from this restricted C, such as loops, global variables, variadic functions, floating-point numbers, and passing structures as function arguments.

AFAIK 手册页未更新。我想知道在使用受限 C 编写 eBPF 程序时究竟禁止什么?手册页所说的仍然正确吗?

最佳答案

这并不是 ELF 文件本身“允许”什么的问题。这句话意味着一旦编译成 eBPF 指令,你的 C 代码可能会产生被验证者拒绝的代码。例如,BPF 程序中的循环在 BPF 程序中长期以来一直被拒绝,因为无法保证它们会终止(唯一的解决方法是在编译时展开它们)。

所以您基本上可以在 C 中使用几乎任何您想要的东西,并成功地生成一个 ELF 目标文件。但是你希望它通过验证器。哪些组件肯定会导致验证者提示?让我们看一下手册页中的列表:

  • 循环:Linux 5.3 版引入了对有界循环的支持,因此循环现在可以在一定程度上发挥作用。 “有界循环”是指验证者有办法告诉他们最终会完成的循环:通常是for (i = 0; i < CONSTANT; i++)。 kind 循环应该可以工作(假设 i 未在 block 中修改)。

  • 全局变量:最近有一些支持全局变量的工作,但它们是以特定方式处理的(作为单项映射),我还没有真正试验过它们,所以我不知道这是多么透明,如果您可以简单地在程序中定义全局变量。随意尝试 :)。

  • 可变参数函数:很确定这是不支持的,我目前不明白这将如何在 eBPF 中转换。

  • float :仍不支持。

  • 将结构作为函数参数传递:不支持,但我认为将指针传递给结构应该可行。

如果您对这一级别的详细信息感兴趣,您真的应该看看 Cilium's documentation on BPF .它不是完全最新的(只缺少非常新的功能),但比手册页更完整和准确。特别是,the LLVM section有一个应该或不应该在编译为 eBPF 的 C 程序中工作的项目列表。除了上述项目外,他们还引用:

  • (所有函数都需要内联,没有函数调用)-> 这个已经过时了,BPF 有函数调用。

  • 没有共享库调用:这是事实。您不能调用标准库中的函数,或其他 BPF 程序中定义的函数。您只能调用在相同 BPF 程序中定义的函数,或在内核中实现的 BPF 助手,或执行“尾调用”。

  • 异常:memset() 的 LLVM 内置函数/memcpy()/memmove()/memcmp()可用(我认为它们几乎是您可以调用的唯一函数,除了 BPF 助手和其他 BPF 函数)。

  • 不允许使用 const 字符串或数组(因为它们在 ELF 文件中的处理方式):我认为这在今天仍然有效?

  • BPF 程序堆栈限制为 512 字节,因此您的 C 程序不得生成试图使用更多字节的可执行文件。

列出了其他允许的或众所周知的项目。我只能鼓励您投入其中!

关于c - ebpf 的受限 C 中不允许什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57688344/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com