LWN: BPF可以调用内核函数了!

simulink可控励磁同步电机模型分析 他励同步电机模型分析 阅读详情

关注了就能看到更多这么棒的文章哦~

Calling kernel functions from BPF

By Jonathan Corbet
May 13, 2021
DeepL assisted translation
https://lwn.net/Articles/856005/

内核中的 BPF 虚拟机可以支持从用户空间加载程序之后在内核的上下文中安全地执行。然而,如果不能同内核其他部分交互的话,作用就很有限了。BPF 和内核之间的接口一直保持在很小的范围,这其中有很多原因,比如保持安全性以及保持内核对系统的控制。然而,5.13 内核包含了一个功能,今后可以被用来极大地拓宽这些可用的接口:也就是能从 BPF program 直接调用内核函数。

推动这个功能的最直接原因是要在 BPF 中实现 TCP 拥塞控制算法,这是 Martin KaFai Lau 在 5.6 内核中就加入的一项功能。在 BPF 中实现的拥塞控制代码中重新实现了一些内核中已经存在的函数,这并不是一个好做法。如果可能的话,最好是能直接使用内核中现有的函数。这次新增的函数调用机制(也是由 Lau 实现的)就将这种可能性变为了现实。

Making functions available to BPF

在 BPF program 中,要使用一个内核函数,现在只需要对它声明成 extern 并像其他 C 函数一样调用它即可。而在内核里则需要做更多的工作。BPF program 只能访问一组特定的经过允许的函数,而这组函数只可以供指定的 BPF program type 使用,因此内核内的代码必须要确保这些函数在正确的上下文中可用。举例来说,这次的代码提交就是为了让 tcp_slow_start() 对 BPF 可用,但只有拥塞控制程序才可以使用。

向 BPF 程序 "export" 某些函数的过程,就是向与 program type 相关的 bpf_verifier_ops structure 添加一个新函数:

bool (*check_kfunc_call)(u32 kfunc_btf_id);

当 BPF verifer 看到一个对外部函数的调用时,就会执行这个函数,其中 kfunc_btf_id 是分配给 BPF program 要调用的函数的 BPF type format(BTF)ID。如果这个调用应该被允许,那么此函数就返回 true。比如说 tcp_slow_start() 是唯一一个用这种方式提供的函数的话,那么就可以写这样一个函数:

static bool bpf_tcp_ca_check_kfunc_call(u32 id)
{
  return id == BTF_ID(func, tcp_slow_start);
}

如果有很多函数需要 export 的话,不需要用一长串 if 语句来判断,还有更简单的方法,请看相关 commit 中的例子。

除了检查函数是否可用之外,BPF verifier 还要进行其他一系列检查。例如检查传递给函数的参数及其类型是否正确,不正确的 program 将会被拒绝。只有当 verifier 能够确认这个 program 是安全的,才会允许调用,尽管 verifier 其实不能真正知道被调用的函数内部发生了什么,也不知道会出什么错误。

Some questions

到目前为止,拥塞控制程序是唯一使用了这个功能的 program type,但不难想象,今后会有其他 program 出现。这种能力引出了一些有趣的问题,以及如何在未来使用这种功能。

其中第一个问题是:这项能力与多年来一直是 BPF 一部分的 BPF helper 机制有何不同?changelog 中并没有解释这一点,所以编者只能猜测一下。BPF helper program 这些代码是专门供 BPF 程序使用的,必须经过特别的声明,而且需要填写一个 bpf_func_proto 结构并提供给 verifier,可以参看 bpf_map_lookup_elem() 相关代码示例。要将现有的内核函数作为一个 BPF helper 使用的话,意味着要写一个 wrapper 函数,然后再完成上述这些步骤。

用新方法使一个内核函数可被调用的话,只需要定义一个允许调用的 "check" 函数,剩下的就由 BPF 子系统来完成。人们可能会认为,一开始实现 helper 的时候就应该以这种方式来实现,但其实很多必备的底层基础设施是在 helper 机制出现多年后才被开发出来的。比如必须要 BTF,必须要 BPF Linux security module(以前所说的 KRSI)。如果一开始就有这些基础设施的话,可能就不会有 BPF helper 了。

也就是说,BPF helper 的优点是只为了 BPF program 使用的,而内核函数是为了被内核中各个部分调用而存在的。内核中没有稳定的 ABI,所以经常会看到 BPF export 出来的内核函数接口的变化甚至比起 BPF helper 接口变化更频繁。在这个添加了函数调用能力的 commit 中明确说明不保证 ABI:

白名单上的函数不保证作为固定 ABI。这些函数已经被现有的内核 tcp-cc 使用。如果其中任何一个改变了,那么无论是 in-tree 还是 out-of-tre 的 kernel tcp-cc 实现代码都必须更改。

很想知道如果一个内核内部的改动破坏了某个很流行的 BPF program,用户开始抱怨的时候会发生什么。一般来说,提供给 BPF 的功能不算是内核 ABI 的一部分,但这个策略从未被 Linus Torvalds 明确地承认或赞同过。

BPF helper 也被设计成可以从 BPF 上下文中进行安全的调用。换句话说,就是可以从内核之外调用。常规的内核函数在编写时没有考虑到可能会有恶意的调用者。BPF 子系统作为一个整体则竭力确保 BPF program 不会导致崩溃或者被入侵,但该子系统并不能知道在它调用的内核函数内部在做些什么事情,也不能保证给某个函数调用传递的所有参数是符合规范的。如果把错误的函数提供给了 BPF,那么一个错误程序或者恶意程序就可能会利用它们来制造麻烦。

最后,这种机制看起来有点像在内核本身的 export 机制之外的一个后门。export symbol 给 module 调用的时候都要在相关代码旁边加上 EXPORT_SYMBOL() 这个声明,并且这些经常引起人们的关注,以及引发是否该用这种方式把内核内部的东西暴露给外界使用的讨论。而针对 BPF program 的 export 函数是一种比较低调的做法,相关代码可能远离相关函数的定义位置。极端来说,似乎没有什么办法可以阻止某人注册这样的检查函数:

static bool export_the_world(u32 kfunc_btf_id)
{
  return true;
}

如果添加了这个函数的话,那么几乎内核中所有函数都可以被一个正确类型的 BPF program 调用。这不会是什么好事情。理论上来说这样的函数会在代码 review 中被发现,但值得思考的是,有多少人真的 review 过了这组 patch 中加入的 BPF 调用函数的测试代码?这些代码已经被加入到了(完全无关的)traffic-control classifier program type 中。这组(无害的)代码将出现在所有启用了 traffic-control 的系统中。看起来 export 一个错误的函数给 BPF program 从而有意或无意地创造 bug,并不算困难。

这些问题中某些也许可以通过向 BPF 核心代码注册一个得到许可的内核函数列表来解决,也就是不能自己来决定要 export 哪些函数。但目前实现的代码并不是这么做的。

尽管如此,这个 BPF function-calling 机制已经被合并,会被包含在 5.13 版本中。据推测,在未来的版本中大家足够警惕,防止内核函数被不恰当地 export 出来。如果管理得当,这个特性可以被用来为 BPF program 提供许多功能,大大增加了可以用 BPF 做的有用的事情。很期待看到这个特性的后续发展。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

C#串口通信从入门到精通(5)——打开、关闭串口 本文详细介绍如何打开串口 阅读详情

相关推荐

BUSCO评估基因组的完整性

因为数据库收集的时候找的就是在不同的物种间都是单拷贝的基因,所以说在评估的物种里面应该也是单拷贝的状态才对。基因组层面评估:先去基因组上预测这些基因,再去做评估,如果说给他是一个注释好的基因集,这个时候提供的是一个蛋白集合,它就直接是去进行同源搜索,再去评估,看BUSCO数据库里面的这些单拷贝基因有或者无;首先,tblastn也是同源搜索,同源搜索之后,去对转录本进行读码框预测,预测完的结果还是去进行hmmsearch的搜索(hmmsearch是做蛋白质结构域搜索的),最终拿到BUSCO评估结果。

qq_64400864的博客 2959

LWN:让BPF成为一个更安全的内核编程环境!

关注了就能看到更多这么棒的文章哦~BPF as a safer kernel programming environmentSeptember 23, 2022This article was contributed by David VernetLPCDeepL assisted translationhttps://lwn.net/Articles/909095/无论好坏,C语言已经是内核开发...

Linux News搬运工 439

山东大学FPGA课程实验一 加法器设计

电子设计自动化与FPGA设计,实验一 加法器设计

2503_91283667的博客 869

LWN:BPF 中可以长存的指针!

关注了就能看到更多这么棒的文章哦~Long-lived kernel pointers in BPFJuly 14, 2022This article was contributed by David VernetDeepL assisted translationhttps://lwn.net/Articles/900749/BPF 子系统允许程序员编写一些可以在内核空...

Linux News搬运工 675

Flutter项目在M1/M2 Mac上跑iOS模拟器报错?手把手教你搞定‘arm64架构不兼容’问题

本文详细解析了Flutter项目在M1/M2 Mac上运行iOS模拟器时遇到的‘arm64架构不兼容’问题,提供了多种解决方案,包括排除模拟器的arm64架构、强制使用x86_64架构以及修改插件Podspec文件。帮助开发者快速解决架构兼容性问题,提升开发效率。

weixin_33713707的博客 335

Ubuntu20.04下SRS流媒体服务器的安装与开机自启动优化指南

本文详细介绍了在Ubuntu20.04系统下安装SRS流媒体服务器并优化开机自启动的完整指南。从基础环境准备、服务管理方案对比到systemd自启动深度优化,提供了实用的配置技巧和排查方法,帮助用户快速搭建稳定的流媒体服务环境。特别推荐使用systemd方案实现高效的自启动管理。

weixin_29313239的博客 410

LWN: BPF 中也能panic!

关注了就能看到更多这么棒的文章哦~The BPF panic functionBy Jonathan CorbetJuly 18, 2022DeepL assisted translationhttps://lwn.net/Articles/901284/BPF 子系统的关键卖点之一,就是加载 BPF 程序的动作是安全的:BPF verifier 这个验证器会在允许加载 ...

Linux News搬运工 390

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

LWN:针对BPF代码的内存分配器!

关注了就能看到更多这么棒的文章哦~A memory allocator for BPF codeBy Jonathan CorbetFebruary 4, 2022DeepL assist...

Linux News搬运工 388

Netron显示自定义属性,按属性设置不同节点的颜色

本文介绍了一种让Netron显示自定义颜色的方法,可根据某些属性,调整节点的颜色 需求背景: 在分析AI模型精度误差时,用不同等级的红色,表示误差的大小.可以直观地看到误差的传递关系

Hi20240217的博客 1513

【PostgreSQL】PostgreSQL数据库函数比对模板(PG通用)

LOOKUP 函数从单行或单列区域 (区域:工作表上的两个或多个单元格。区域中的单元格可以相邻或不相邻。)或数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。LOOKUP 函数具有两种语法形式:向量形式和数组形式。vlookup查找匹配值超过255个字符显示#Value的解决办法。如果值为错误值 #N/A,则返回 TRUE。

tttzzzqqq2018的博客 1493

eBPF理解 (四)

bpftrace用在快速排除和定位系统上,简单的脚本开发并执行;BCC用在复杂的eBPF开发,使用最广泛;libbpf从内核中抽离出来的标准库,不在需要每台机器安装LLVM和内核头文件。

2113

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1311

LWN:《BPF Performance Tools》介绍!

关注了就能看到更多这么棒的文章哦~A look at "BPF Performance Tools"ByJake EdgeFebruary 26, 2020原文来自:h...

Linux News搬运工 5618

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LWN:在今后十年让BPF保持活力!

关注了就能看到更多这么棒的文章哦~Modernizing BPF for the next 10 yearsBy Daroc AldenJune 7, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/977013/BPF 最初采用来作为对数据包过滤的一个通用化处理方案,这发生在十多年前。在那之后,BPF 发生了巨...

Linux News搬运工 1848

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LWN:BPF与安全!

关注了就能看到更多这么棒的文章哦~BPF and securityBy Jake EdgeOctober 4, 2023LSSEUChatGPT translationhttps://lwn.net/Articles/946389/eBPF内核虚拟机即将迎来其加入Linux十周年,它已经发展成为生态系统中多种用途的工具。eBPF的创始人,也是其早期开发的主要负责人Alexei Starovoito...

Linux News搬运工 1077

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LWN:让BPF program可以睡眠!

关注了就能看到更多这么棒的文章哦~Sleepable BPF programsByJonathan CorbetJuly 7, 2020原文来自:https://lwn.net/Art...

Linux News搬运工 818

LWN:用BPF异步采集stack trace!

关注了就能看到更多这么棒的文章哦~Capturing stack traces asynchronously with BPFBy Daroc AldenJune 19, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/978736/Andrii Nakryiko 在 2024 年的Linux 存储、文件系统、内...

Linux News搬运工 2352

LWN:BPF 通用iterator的实现!

关注了就能看到更多这么棒的文章哦~Generic iterators for BPFBy Jonathan CorbetMarch 17, 2023DeepL assisted translationhttps://lwn.net/Articles/926041/会被加载到内核中的 BPF 程序通常是用 C 语言编写的,但是,这些程序运行的环境跟 C 语言环境差异越来越大了。BPF 虚拟机和相关的...

Linux News搬运工 952

LWN:多种改善BPF性能的方案!

关注了就能看到更多这么棒的文章哦~A medley of performance-related BPF patchesByJonathan CorbetJanuary 2, 2020...

Linux News搬运工 980

LWN:可取消的BPF program!

关注了就能看到更多这么棒的文章哦~A possible path for cancelable BPF programsBy Daroc AldenFebruary 25, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1010404/Linux 内核支持将 BPF 程序附加(attach)到许多操作(operations)上。这...

Linux News搬运工 1338

LWN:使用BPF来选择OOM kill的对象!

关注了就能看到更多这么棒的文章哦~Out-of-memory victim selection with BPFBy Jonathan CorbetAugust 17, 2023ChatGPT assisted translationhttps://lwn.net/Articles/941614/默认配置下的 Linux 内核允许进程分配的内存比系统实际可提供的内存更多。这个策略可以更好地利用物理...

Linux News搬运工 1047

LWN:用BPF来修改kernel里的operation structure!

关注了就能看到更多这么棒的文章哦~Kernel operations structures in BPFByJonathan CorbetFebruary 7, 2020原文来自:ht...

Linux News搬运工 577

LWN: 对BPF tracing进行类型检测

Type checking for BPF tracingByJonathan CorbetOctober 28, 2019原文来自:https://lwn.net/A...

Linux News搬运工 617

【转】BPF详解

原文地址:https://linux.cn/article-9507-1.html 什么是 BPF? BPF,及伯克利包过滤器BerkeleyPacketFilter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核...

mrhesongze的博客 1万+

LWN:KRSI与propprietary BPF program!

关注了就能看到更多这么棒的文章哦~KRSI and proprietary BPF programsByJonathan CorbetJanuary 17, 2020原文来自:htt...

Linux News搬运工 854
上一篇: LWN:5.13 内核中导出符号的变化!
下一篇: LWN:新增misc cgroup!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值