如果我最初理解得很好,cBPF验证器和解释器都在net/core/fiter.c
范围内,例如sk_run_filter
在这里 https://elixir.bootlin.com/linux/v3.2/source/net/core/filter.c#L112 只需转换cBPF指令,将它们应用于仿真寄存器并直接应用于sk_buff。sk_chk_filter
检查说明是否合法。
目前我已经看到 filter.c 中仍然有一个bpf_check_classic
函数来替换旧的sk_chk_filter
。检查后,尝试对程序进行JIT,如果不可能,下一步是在eBPF中转换cBPF。
问题:
1( 在最后net/core/filter.c
中运行抖动/转换的 CBPF 滤波器的调用实际上在哪里?
2(使cBPF程序作为eBPF程序执行的函数调用顺序是什么?
据我所知,cBPF程序仅用于seccomp-bpf和套接字过滤器。
- 对于seccomp-bpf,实际调用是在程序转换为eBPF之后的
kernel/seccomp.c
。 - 对于套接字过滤器,实际调用是
net/core/filter.c
,正如您所猜测的。 然后,sk_filter_trim_cap()
在内核中的许多位置被调用,用于所有类型的套接字。