内核里的卢亚?

2020-09-18 14:45:17

LLVM有一个BPF后端,但它基本上是建立在希望和运气之上的。通常,LLVM不能承诺生成将通过验证器BPF。(参见,例如https://lists.llvm.org/pipermail/cfe-dev/2020-June/065894...。关于这方面的一些讨论)。我不认为带验证器的BPF真的有C编译器可以合理瞄准的规范!当然,如果您正确地设计了输入C代码,并且优化器不会做一些太复杂的事情,那么它在实践中通常是可行的。但是,如果您幸运的话,您的程序将会运行,但是由于正常的编译器优化,它可能会被神秘地拒绝--祝您好运!";是一个非常令人不满意的系统设计。我还没有调查过,但我敢打赌GCC的后台也有同样的属性。但是,我认为您低估了BPF模型提供的真正优势--知道程序保证正常完成是有用的!如果您只是简单地计算已执行指令的数量,则可以确保程序不会永远运行--但只有在达到限制时才会动态中止它。想象一下--您正在运行BPF的指令计数版本(或者,比如说,kernel-lua),并且BPF程序正在为路由器执行一些重要的数据包处理。当前版本的程序执行的指令总是少于$DYNAMIC_INSTRUCTION_LIMIT指令来处理任何数据包,一切都很正常。然后,您修改程序--再添加一个明显正确的微不足道的检查--突然之间,您就开始达到限制,并且每当您得到一个具有某种属性组合的数据包时,这些属性加在一起,现在就超过了限制,就会中止。当然,它不会在每个数据包上都失败--那太容易了。这种意外很可能会导致严重的停机!在当前的BPF下,这是不可能发生的。