BPF:程序上下文的翻译

2024-01-27

我正在研究不同类型的BPF程序,并注意到对于不同的程序类型,上下文的传递方式不同。

Example:

  1. 对于节目类型BPF_PROG_TYPE_SOCK_OPS,类型的对象struct bpf_sock_ops_kern https://elixir.bootlin.com/linux/latest/source/include/net/tcp.h#L2009已通过。然而,这种类型的 BPF 程序引用了struct bpf_sock_ops https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/bpf.h#L931。为什么这样做,“翻译”出自哪里bpf_sock_ops_kern to bpf_sock_ops?

  2. 对于节目类型BPF_PROG_TYPE_CGROUP_SKB,类型的对象struct sk_buff https://elixir.bootlin.com/linux/latest/source/include/linux/skbuff.h#L658已通过(例如,在__cgroup_bpf_run_filter_skb https://elixir.bootlin.com/linux/latest/source/kernel/bpf/cgroup.c#L446),但 BPF 程序需要最小化版本,struct __sk_buff https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/bpf.h#L799.

所以我看了看the struct bpf_verifier_ops函数回调 https://elixir.bootlin.com/linux/latest/source/net/core/filter.c#L4195,但它们似乎只调整 BPF 指令中的偏移量,因为它们是由 BPF 验证器调用的。

如果有人能够阐明 BPF 上下文是如何定义的,我会很高兴。谢谢。


镜像对象(例如,struct bpf_sock_ops https://elixir.bootlin.com/linux/v4.15.7/source/include/uapi/linux/bpf.h#L931)作为参数传递,将原始对象字段的子集公开给 BPF 程序。镜像结构还可以具有来自多个不同原始结构的场;在这种情况下,镜像对象充当聚合。将原始对象传递给 BPF 程序也会产生误导,因为用户可能认为他们可以访问所有字段。例如,他们可能认为自己有权访问bpf_sock_ops_kern.sk https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/filter.h#L982但事实并非如此。

然后,在程序第一次执行之前,验证器将对镜像对象的访问转换为对原始对象的访问。每种类型的镜像对象都有一个转换函数(例如,sock_ops_convert_ctx_access https://elixir.bootlin.com/linux/v4.15.7/source/net/core/filter.c#L4313用于将访问转换为struct bpf_sock_ops https://elixir.bootlin.com/linux/v4.15.7/source/include/uapi/linux/bpf.h#L931)。然后,对于镜像对象的每个字段(即,对于每个偏移量),转换函数使用原始字段的偏移量重写加载或存储指令。

请注意,所有原始字段可能不在同一个对象中。例如,在镜像对象中struct bpf_sock_ops https://elixir.bootlin.com/linux/v4.15.7/source/include/uapi/linux/bpf.h#L931, 田野op and family被检索到bpf_sock_ops_kern.op https://elixir.bootlin.com/linux/v4.15.7/source/net/core/filter.c#L4333 and bpf_sock_ops_kern.sk->skc_family https://elixir.bootlin.com/linux/v4.15.7/source/net/core/filter.c#L4345分别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BPF:程序上下文的翻译 的相关文章

随机推荐

  • 没有这样的目的地

    我在我的网站中使用 Stripe 方法 用户从我的网站购买产品并通过 stripe 完成付款 我想收取佣金并将剩余的钱发送给服务提供商 当我尝试在条纹中使用传输方法时 它会显示错误消息 message No such destination
  • 如何使用 jq 获取两个 JSON 数组的交集

    给定数组 X 和 Y 最好都作为输入 但否则 一个作为输入 另一个硬编码 如何使用 jq 输出包含两者共有的所有元素的数组 例如f 的值是多少 使得 echo 1 2 3 4 jq f 2 4 6 8 10 会输出 2 4 我尝试过以下方法
  • 你能在 jQuery 中扩展 val() 函数吗?

    有没有办法扩展 jQuery 中的 val 函数 基本上 我想要做的是如果有内容被动态输入到输入中 则设置一个类变量 通常会是这样的 var thisVal Hello World myInput val thisVal addClass
  • Javascript parseFloat 和 null

    我对 javascript 非常陌生 因为我目前正在 jQuery Mobile 中制作跨平台 Web 应用程序 我已经使用了 XML 解析到 HighCharts 图表的示例 但是当我在系列数据中遇到 null 时 它无法绘制任何线条并使
  • 颜色逐渐变化

    屏幕左上角的标志如何随着鼠标滑过而逐渐改变颜色 我认为它是用 jquery 完成的 如果您不知道代码 您能给我指点可以的教程吗 谢谢 http www shopdev co uk blog http www shopdev co uk bl
  • 即使进行所有优化,Android 模拟器也会出现延迟

    HAXM 启用版本 7 1 0 我验证了它在模拟器运行时正常工作 模拟器使用 Nvidia GPU 但在任何给定时间它仅使用最多 7 的 GPU 我有 27 3 1 的模拟器版本 最新 尝试过 x86 图像和 x86 x64 图像 我尝试过
  • 多个按钮上的 javascript 函数

    我有三个按钮 我希望它们在按下时改变颜色 并在再次按下时恢复为无颜色 我在 stackoverflow 上找到了这段代码 它几乎可以让我做到这一点 但是它只适用于一个按钮 其他两个不受影响 另外 当我按下另外两个按钮中的一个时 第一个按钮会
  • 如何在 mongodb 中更新多个数组元素

    我有一个 Mongo 文档 其中包含一个元素数组 我想重置 handled数组中所有对象的属性 其中 profile XX 该文件的形式如下 id ObjectId 4d2d8deff4e6c1d71fc29a07 user id 7146
  • 发帖后查看未更新

    我有一个控制器方法 CreateOrUpdate 该方法应该将汽车保存到数据库 然后正常返回 public ActionResult CreateOrUpdate int ID 0 Car car new Car ID HttpPost p
  • 如何测试 JSONObject 是否为空或不存在

    我有一套JSONObject我从服务器接收并操作的值 大多数时候我得到一个JSONObject带有一个值 比如说统计数据 有时 它返回一个Error带有代码和错误描述的对象 如何构建我的代码 使其在返回错误时不会中断 我以为我可以做到这一点
  • 非规范化是为了理智还是为了性能?

    我开始了一个新项目 他们有一个非常标准化的数据库 所有可以查找的内容都存储为查找表的外键 这是规范化的并且很好 但我最终为最简单的查询执行了 5 个表连接 from va in VehicleActions join vat in Vehi
  • 未找到 Laravel Passport 安装类

    我正在尝试配置我的 Laravel 应用程序以使用 Passport 但在加载 AppServiceProvider php 中的类时遇到了困难 这是我所做的
  • 为什么我的 MFC 应用程序在与两个滚动条交互后挂起?

    我正在开发一个 MFC 应用程序 在 Win10 下运行 其中包含一个图形 CAD 样式编辑器窗口 编辑器窗口包含用户可以重新定位和配置的图标 在包含许多元素的布局中 我们发现编辑器窗口可能会挂起长达 30 秒 这个问题是not当我们的大多
  • 使用 AngularJS 排除 url 中的路径

    我的角度应用程序有多个用户可以访问的页面 我想隐藏所有其他网址并仅向用户显示基本网址 因此 假设我的基本网址是 www example com 并且我还有其他页面 例如 关于 联系我们 等 目前 当用户单击 关于 时 网址将更改为 www
  • 本地通知

    本地通知可以在模拟器上运行吗 如果我关闭 而不是最小化 程序 本地通知会运行吗 是的 也是的 看 http iphonesdkdev blogspot com 2010 04 local push notification sample c
  • DataGrid 列标题与数据不对齐

    我有一个 DataGrid 就 DataGrid 而言它非常简单 由于某种原因 标题与其余数据不对齐 如下面的屏幕截图所示 我已经在互联网上搜索过 但似乎找不到解决方案 这是我的数据网格代码 Grid gt
  • 如何在不编译的情况下安装wkhtmltopdf补丁qt?

    我正在使用 google 云实例作为主机 Odoo somo 报告打印为 pdf 正常 但其他使用自定义纸张格式的会出现以下错误 开关 header spacing 不支持使用未打补丁的 qt 将被忽略 开关 header html 不支持
  • 在Python 3.0中动态向类添加方法

    我正在尝试用 Python 编写一个数据库抽象层 它允许您使用链式函数调用构建 SQL 语句 例如 results db search book author J K Rowling price lt 40 00 title Harry e
  • 使用 C 预处理器的嵌套宏迭代

    使用 C 预处理器 您可以拥有某种高阶宏 像这样的事情 define ABC f f a f b f c define XY f f x f y define CODE x foo x ABC CODE undef CODE define
  • BPF:程序上下文的翻译

    我正在研究不同类型的BPF程序 并注意到对于不同的程序类型 上下文的传递方式不同 Example 对于节目类型BPF PROG TYPE SOCK OPS 类型的对象struct bpf sock ops kern https elixir