c - net/core/filter.c 和 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 上。同时sk_chk_filter
检查说明是否全部合法。
目前我已经看到 filter.c 中仍然有一个bpf_check_classic
函数可以替代旧的sk_chk_filter
. 检查后尝试 JIT 程序,如果不可能,下一步是将 cBPF 转换为 eBPF。
问题:
1)最后运行jitted/converted cbpf过滤器的实际调用在net/core/filter.c
哪里?
2) 将 cBPF 程序作为 eBPF 程序执行的函数调用序列是什么?
解决方案
据我所知,cBPF 程序仅用于 seccomp-bpf 和套接字过滤器。
- 对于 seccomp-bpf,实际调用是在
kernel/seccomp.c
程序转换为 eBPF 之后。 - 如您所料,对于套接字过滤器,实际调用是 in
net/core/filter.c
。sk_filter_trim_cap()
然后在内核中的许多地方被调用,用于所有类型的套接字。
推荐阅读
- php - 强制 zxcvbn.min.js 从 CDN 拉取?
- module - insmod 适用于 6.5 操作系统,但不适用于 7.3 操作系统 - 显示模块验证失败:
- python - 2个变量同时遍历List
- ios - 在私有数据库的 ckzone 中查询共享记录不返回任何内容
- javascript - 你如何将 backgroundImage 添加到反应组件中的 div ?
- mysql - 错误:reference.class BelongsTo 扩展关联
- java - 如何使用文件资源管理器 Android Studio 将歌曲添加到我的歌曲播放列表?
- c# - C# Linq 将多个值组合成数据行
- python - \2 表示正则表达式
- java - 为什么 Firestore DocumentSnapshot 数据大小始终为零?