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

MATLAB 设置legend加标题 x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon 阅读详情

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

BPF as a safer kernel programming environment

September 23, 2022
This article was contributed by David Vernet
LPC
DeepL assisted translation
https://lwn.net/Articles/909095/

无论好坏,C语言已经是内核开发领域的通用语言了。Linux 内核的核心逻辑完全是用 C 语言编写的(加上一点汇编),它的驱动程序和 module 也是如此。虽然 C 语言因其强大而简单的语义而受到赞誉,但它是一种古老的语言,缺乏现代语言(如 Rust)中的许多特性。另一方面,BPF 子系统也提供了一个编程环境,工程师能够编写可以在内核空间安全运行的程序。在爱尔兰都柏林举行的 2022 年 Linux Plumbers Conference 上,Alexei Starovoitov 概述了 BPF 多年来的发展,为内核编程提供了一个新的参考模型。

0f8ea29cdb51060cdf7b243fab88c069.png


The mission of BPF

Starovoitov 首先描述了他对 BPF 的 "mission statement, 使命宣言":"创新、并启发大家创新"。内核中的编程历来是在两种情况下进行的:

  • core kernel 开发,包括主要的核心子系统,如内存管理、调度器、read-copy-update,等等。

  • kernel-module 开发,指的是构建那些不被编译到 main kernel image 里的内容,由 module loader 在后续加载。例如,驱动程序被写成一些内核 module,也有其他功能是这么做的,如文件系统、网络协议等等。

这是内核在很长一段时间内的状态,直到 3.15 版的内核中加入了最早版本的 extended BPF(eBPF)虚拟机。有了它之后,BPF program 可以用一个受到严格限制的 C 语言来编写,并被编译成 BPF 字节码,这将允许用户编写的代码可以经过验证确保安全,然后再在内核空间运行。

从那时起,BPF 在代码的规模、用户及贡献者社区的规模方面都稳步增长。根据 Starovoitov 的说法,BPF 邮件列表上每天都会收到 50-70 条信息,每月大约收到 2000 封邮件。平均每月里活跃贡献的 BPF 贡献者的数量也在同步增长,截至 2022 年 9 月,已达到约 140 人。目前来说,对 BPF 子系统的大部分贡献都不是来自 Meta BPF 小组了。

The BPF programming environment

虽然大多数 BPF 程序是用 C 语言编写的,并用 LLVM Clang 编译器编译,但 BPF program 只是二进制 BPF 字节码对象文件,并未规定要用某种特定的语言来写。比如说,BPF 程序可以使用 Aya 来采用 Rust 编写,甚至可以直接用 BPF 汇编语言编写。也就是说,C是 BPF 程序的典型(canonical)编程语言;Starovoitov 的演讲继续概述了 BPF program 开发中 C 编程环境是如何演进的。

这个新的编程环境混合使用了 C 语言扩展以及运行时环境的组合实现的,这个运行时环境包含了 Clang、用户空间的 BPF 加载器库(libbpf)和内核中的 BPF 子系统。要想创建一个 BPF 程序,用户只要用 C 语言写一个程序,由 Clang 的 backend 实现来转换成 BPF 指令。在运行程序时,libbpf 将 BPF 程序加载到内存中,对程序进行重定位以使其可以跨平台以及不同的内核版本从而具备良好的可移植性,然后调用 kernel 来加载程序。最后在内核中,verifier 会采用静态方式验证该程序是否可以安全运行,然后启用之。

然而,BPF 的编程环境并不是一上来就这么丰富的。在 BPF 的早期,程序被要求使用 Starovoitov 所说的 "restricted C"。BPF 程序中的所有函数都必须完全是 inline 的,loop 循环、静态变量和全局变量以及内存分配都是不允许的。也没有类型信息(type information),所以 BPF 程序只能接收单一的、固定的 input context,用于 tracing 以及 network-filtering 相关功能。

尽管在这样一个高度限制性的环境中编写 BPF 程序也是很有用的,但很明显, BPF 所支持的使用场景还可以得到很大的扩展。其中一个扩展就是允许在 BPF 程序中使用静态函数。这样做需要使用 libbpf 在程序加载时对内核 BPF 程序进行重定位。经过多年的设计和尝试,最终也增加了对有限循环的支持,此外也支持了 iterator。

Extending the programming environment past full C

虽然这些使得 BPF 更接近于完整的 C 语言了,但最终可以看到,BPF 程序需要的一些功能甚至在完整的 C 语言标准中都没有。于是 BPF 社区开始扩展 BPF 编程环境,从而包括一些传统 C 语言没有的新特性。其中一个扩展功能就是 "一次编译-到处运行"(CO-RE, Compile Once - Run Everywhere)。

CO-RE 使 BPF 程序可以在不同的内核版本和平台上都可以运行。在 BPF 程序中,访问内核数据结构是很常见的行为。然而,内核没有为 struct layer 确保 ABI 不变,因此,如果内核结构在未来的版本或不同的 config 下发生了变化,在固定偏移的地方对内核结构进行读取的 BPF 程序可能就会读到错误的值。CO-RE 通过利用运行中的内核中的 BPF 类型格式(BTF)数据来解决这个问题。在加载一个程序时,libbpf 对所有的 struct 的访问都会进行重定位,以便根据当前运行的内核的 BTF 信息让被访问的字段的偏移量匹配上。

Starovoitov 还描述了 BPF 编程环境的其他一些有趣的新增功能。其中一个是 kptrs,它允许将内核内存的指针存储在 BPF map 中。另一个功能是允许程序在加载时访问内核 config 参数。内核 module 只能使用编译时设置的 config 值,但 BPF 程序在加载时可以根据当前内核的配置来决定自己的行为。还有一个特点是 "type tags",可以让程序能对变量进行 annotation,从而描述它们的使用方式。例如,kptrs 可以用 __kptr 和 __kptr_ref type tags 来进行标注,从而表明它们分别是 unreferenced 或者 referenced kptr。当然指针也可以用 __user 或 __percpu 标准,来告诉编译器和 verifier 这个指针分别指向用户内存或 per-CPU 内存。

Plans for the future

目前正在设计和实现更多的扩展,包括 lock-correctness 正确性验证,以及支持 BPF 程序包含 assertion。lock 的验证乍一看似乎是一个很难解决的问题,而 Dave Marchevsky 和 Kumar Kartikeya Dwivedi 都已经发出了 RFC patch set 来实现用于 lock 验证的新 map type。Marchevsky 的 patch set 提出了一个新的红黑树 map type,而 Dwivedi 的 patch set 提出了一个 list map type。这两个 patch set 都实现了共同的效果,允许 BPF 程序执行由 verifier 检查和验证过的 locking 机制。

assertion 验证仍处于规划阶段,实现起来可能会很复杂。assertion 将作为给编译器和 verifier 的信号,assertion 被用来指示程序中的一些不变的因素,这些不变因素的失败将导致程序中止。Starovoitov 声称,弄清如何让程序中止,这会是一个 "有趣" 的问题,因为它需要安全地对堆栈进行 unwind,调用 kptr destructor,以及其他收尾工作。

Starovoitov 在演讲的最后分享了他对 BPF 未来的观点:会取代内核模块成为扩展内核的有效方式。早期版本的 BPF 程序看起来更像是带有固定的 BPF helper function 和固定的 map type 的用户空间程序,而如今新的 BPF 已经可以让用户在更多个性化使用场景下对内核进行扩展。事实上,这样的使用场景已经在 upstream 社区被提出来了。在 Starovoitov 之后在 LPC 发言的 Benjamin Tissoires,一直在开发一个 patch set,希望用 BPF 程序来 fix 人类输入设备(HID)的 quirk。到目前为止,还没有一个内核 module 被 BPF 程序完全取代掉,不过,很期待看到内核的其他一些功能可以在 BPF 程序中实现。

一位听众要求了解 Starovoitov 所提到的 lock-correctness 验证的更多细节。Starovoitov 说,这个工作还在进行当中,但他乐观地认为可以找到一种方法来进行 static lock checking,从而验证数据保护是正确的,并保证不会发生死锁。Dave Miller 回应说,如果锁可以由 verifier 进行静态检查,那么可能可以研究一下 locking 逻辑是否可以由 verifier 自动生成。Starovoitov 回答说,这就是他们希望实现的目标,目前的设计中将 lock 和受保护的数据在同一次 allocation 中放在一起。对于不能跟 lock 放在一起的数据,可以用 BTF type tag 来指定它需要明确进行锁保护。

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

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

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

format,png

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包) 本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。 阅读详情

相关推荐

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 283

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

关注了就能看到更多这么棒的文章哦~Calling kernel functions from BPFBy Jonathan CorbetMay 13, 2021DeepL assisted...

Linux News搬运工 997

python解析通达信dat与blk数据文件【附源码】

本文介绍了一个完整的通达信金融数据解析器项目,该项目攻克了通达信专有二进制文件格式解析的技术难题。项目采用模块化架构,从基础二进制解析到增强数据分类,最终实现智能语义化列名生成,形成完整的数据处理链路。核心技术包括自适应编码检测、智能数据类型推断和基于业务规则的语义化处理,解决了逆向工程、多编码兼容性等挑战。项目成果显著,解析成功率达100%,数据可读性大幅提升,开发效率提高50%,为量化交易、可视化分析等场景提供了可靠数据支持。该方案不仅具备技术创新性,更具有实际工程应用价值,为金融数据分析领域提供了可复

qq_36224726的博客 2688

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

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

Linux News搬运工 388

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析

通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。

2201_76125261的博客 720

使用R语言实战:构建Logistic回归模型

Logistic回归是一种基于概率的分类算法,它用于预测离散的结果变量(也称为响应变量或因变量)。与线性回归不同,Logistic回归的输出是一个概率值,通常在0和1之间。这使得它非常适合处理二分类问题。市场营销:预测客户是否会购买某个产品。医学研究:预测疾病的发生与否。信用风险评估:预测个人申请贷款的违约风险。社会科学:预测个人对某个政策的态度。

2301_79331230的博客 1139

LWN: BPF 中也能panic!

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

Linux News搬运工 390

29、Power BI 中行级安全(RLS)的实现与应用

本文详细介绍了在Power BI中实现行级安全(RLS)的方法,包括静态RLS和动态RLS的实现流程、适用场景及对比分析。通过具体业务场景,展示了如何创建安全角色、定义规则、验证角色、发布模型以及分配成员。此外,还探讨了更复杂的动态RLS场景,如基于父子层次结构的数据访问控制和从外部源获取用户信息的实现方式。文章最后总结了最佳实践建议及未来发展趋势,为企业在Power BI中高效、安全地实施数据访问控制提供了全面指导。

terraform7cloud的博客 195

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

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1117

30天入门 SAP BTP 开发系列之十四: 将 SAP Business Application Studio 里开发好的 Node.js 应用部署到 Cloud Foundry 环境中

本教程详细介绍了如何将SAP Business Application Studio中的Node.js应用部署到Cloud Foundry环境。在完成本地开发和测试后,通过cf login命令连接Cloud Foundry环境,配置manifest.yml文件指定应用参数和路由信息。使用cf push命令完成应用的上传和部署,最终使应用运行在SAP BTP的云端环境中。教程包含从路由创建到部署验证的完整流程,确保开发者能够成功将Node.js应用发布到生产环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1075

LWN: Kubernetes利用BPF来增强测试以及安全防护

点击上方蓝色字关注我们~BPF for security—and chaos—in KubernetesJune 10, 2019This article was con...

Linux News搬运工 507

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 31

LWN:《BPF Performance Tools》介绍!

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

Linux News搬运工 5618

老版QQ原生表情gif动态

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LWN:BPF与安全!

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

Linux News搬运工 1077

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LWN:BPF 通用iterator的实现!

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

Linux News搬运工 952

【转】BPF详解

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

mrhesongze的博客 1万+

LWN:可由BPF编程的网络设备!

关注了就能看到更多这么棒的文章哦~The BPF-programmable network deviceBy Jonathan CorbetNovember 6, 2023ChatGPT translationhttps://lwn.net/Articles/949960/在 Linux 上,容器和虚拟机是通过虚拟网络设备与世界通信。这样就使得其可以利用 Linux 网络协议栈的全部功能了,但也引...

Linux News搬运工 1040

LWN:让BPF program可以睡眠!

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

Linux News搬运工 818

LWN:KRSI与propprietary BPF program!

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

Linux News搬运工 854

LWN: 对BPF tracing进行类型检测

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

Linux News搬运工 617

LWN:非特权的BPF以及进行额外授权的security hook!

关注了就能看到更多这么棒的文章哦~Unprivileged BPF and authoritative security hooksBy Jonathan CorbetApril 27, 2023DeepL assisted translationhttps://lwn.net/Articles/929746/当 Linux 安全模块(LSM, Linux security module)子系统的...

Linux News搬运工 1190

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循环!

关注了就能看到更多这么棒的文章哦~A different approach to BPF loopsBy Jonathan CorbetNovember 29, 2021DeepL ass...

Linux News搬运工 663

LWN: Spectre 漏洞利用了BPF!

关注了就能看到更多这么棒的文章哦~Spectre revisits BPFBy Jonathan CorbetJune 24, 2021DeepL assisted translation...

Linux News搬运工 756
上一篇: LWN:利用sanitizer寻找bug!
下一篇: LWN:在kernel中更安全地使用可变长度数组!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值