eBPF程序验证与类型详解
许可证与辅助函数
如果程序采用GPL许可证,那么它也需具备GPL兼容许可证。在示例代码 hello-verifier.bpf.c 的第6章示例中,最后一行定义了一个“license”部分,其值为字符串 Dual BSD/GPL 。若移除这一行,验证器的输出将显示如下错误:
...
37: (85) call bpf_probe_read_kernel#113
cannot call GPL-restricted function from non-GPL compatible
program
这是因为 bpf_probe_read_kernel() 辅助函数的 gpl_only 字段被设置为 true 。在这个eBPF程序中,虽然之前也调用了其他辅助函数,但它们并非GPL许可的,所以验证器不会对其使用提出异议。BCC项目维护了一个辅助函数列表,标明了它们是否为GPL许可。
内存访问检查
验证器会执行多项检查,以确保BPF程序仅访问其有权限访问的内存。例如,在处理网络数据包时,XDP程序仅允许访问构成该网络数据包的内存位置。大多数XDP程序开头类似如下代码:
SEC("xdp")
int xdp_load_balancer(struct xdp_md *ctx)
{
void *data = (voi
超级会员免费看
订阅专栏 解锁全文
54

被折叠的 条评论
为什么被折叠?



