net/core/filter.c 和 linux/bpf/verifier.c
net/core/filter.c and linux/bpf/verifier.c
如果我最初理解得很好,cBPF 验证器和解释器都在 net/core/fiter.c
内,例如 sk_run_filter
这里 https://elixir.bootlin.com/linux/v3.2/source/net/core/filter.c#L112 只需转换 cBPF 指令,将它们应用于模拟寄存器并直接应用于sk_buff。
whilesk_chk_filter
检查指令是否全部合法
目前我看到 filter.c 中还有一个 bpf_check_classic
函数替代了旧的 sk_chk_filter
。检查后会尝试 JIT 程序,如果不可能,下一步就是将 cBPF 转换为 eBPF。
问题:
1) 最后 net/core/filter.c
中对 运行 jitted/converted cbpf 过滤器的实际调用在哪里?
2) 将 cBPF 程序作为 eBPF 程序执行的函数调用序列是什么?
据我所知,cBPF 程序仅用于 seccomp-bpf 和套接字过滤器。
- 对于seccomp-bpf,实际调用是在
kernel/seccomp.c
,在程序已经转换为eBPF之后。
- 对于套接字过滤器,实际调用在内核中
net/core/filter.c
, as you guessed. sk_filter_trim_cap()
then gets called in a number of places,适用于所有类型的套接字。
如果我最初理解得很好,cBPF 验证器和解释器都在 net/core/fiter.c
内,例如 sk_run_filter
这里 https://elixir.bootlin.com/linux/v3.2/source/net/core/filter.c#L112 只需转换 cBPF 指令,将它们应用于模拟寄存器并直接应用于sk_buff。
whilesk_chk_filter
检查指令是否全部合法
目前我看到 filter.c 中还有一个 bpf_check_classic
函数替代了旧的 sk_chk_filter
。检查后会尝试 JIT 程序,如果不可能,下一步就是将 cBPF 转换为 eBPF。
问题:
1) 最后 net/core/filter.c
中对 运行 jitted/converted cbpf 过滤器的实际调用在哪里?
2) 将 cBPF 程序作为 eBPF 程序执行的函数调用序列是什么?
据我所知,cBPF 程序仅用于 seccomp-bpf 和套接字过滤器。
- 对于seccomp-bpf,实际调用是在
kernel/seccomp.c
,在程序已经转换为eBPF之后。 - 对于套接字过滤器,实际调用在内核中
net/core/filter.c
, as you guessed.sk_filter_trim_cap()
then gets called in a number of places,适用于所有类型的套接字。