LWN:使用GCC编译生成BPF程序

Ubuntu下bpf纯c程序的编写与运行 1. 前言 2. 搭建bpf程序运行环境 2.1 下载源码 3. bpf代码分析及运行 4. 总结 阅读详情
640
点击上方蓝色“Linux News搬运工”关注我们~

Compiling to BPF with GCC

By Jonathan Corbet


LPC

自从在kernel里加上eBPF (extended BPF) 之后,诞生了很多各式各样的应用场景。不过还是只有很少人真正写过BPF代码。因为目前BPF代码就有点像其他那些汇编级语言,挺难用的。写BPF program是可以用C语言的,LLVM编译器可以把C语言编译成BPF program。不过,在2019 Linux Plumbers Conference上的Toolchains microconference中,Jose Marchesi指出,LLVM不久后会成立一个公司,所以他就在GCC编译器里也加上了BPF back-end支持。

640

Marchesi自己定位是一个编译器工作者,而不是BPF trace专家。他介绍说GCC的支持经过了3个阶段。首先在toolchain里添加BPF的最基本的支持,包括让GCC能支持一个新的bpf-unknown-none的target,以及binutils在5月份就支持了BPF;在会议之前,GCC的代码库里合入了BPF支持。

从现在起,GCC可以编译生成BPF program了,不过还有一个障碍:生成的BPF program必须要能通过kernel里的BPF verifier的审查。也就是说编译生成的program需要指令顺序符合规范。Marchesi认为应该还是能够做到的,随着kernel verifier也在变得更加聪明(例如支持有限次数的循环了),那么GCC生成代码这边的难度也会更加小一些。

最后一个阶段还在进行中,就是需要为开发者们创造一些新的工具。例如BPF的simulator,用来在user space运行,可以通过GDB来调试BPF program。在他看来,BPF就像是某种类型的嵌入式平台一样,需要针对这种平台创建各种工具才能让普通开发者正常进行开发。

他认为BPF virtual machine就像是一种特殊类型的平台,表面上看起来很普通,其实不然。这个虚拟机需要依赖kernel提供的各种helper功能。他打算把这些helper功能重新在GCC内部也实现出来,这种方式就跟LLVM所用的不一样了。他认为这种方案更加稳定,不过会需要长久维护这些helper功能。要想维护好这些helper,还是很有难度的,因为每个kernel版本都不一样。这就意味着GCC需要使用一个新的参数(例如-mkernel=)来指定kernel版本号,就像是-mcpu用来指定CPU一样。这样的话,编译器就能抓出来那些在目标版本kernel中并不支持的helper功能了。

Peter Zijlstra在这里插了一个问题,是否也支持各种企业版的kernel版本。这些发行版里面,kernel可能包含了很多backport patch,所以base版本号其实并不能精确反映这个信息。Marchesi的回答是他现在还只支持mainline kernel的版本号。H. Peter Anvin建议可以把这些helper信息放到kernel的UAPI头文件里面去,这样在编译时就能直接拿到了。Nick Alcock则建议说,可以利用参数上指定的kernel版本号来读取某个描述文件,从而确定支持哪些helper。还有一位听众则认为把helper函数builtin到GCC里不是个好方法。如果用户拿到新的kernel,他们就没法编译BPF来利用新增的helper功能了。

Marchesi继续介绍,他希望能对C语言支持的越完整越好。不过这个很困难,因为BPF program的限制很多。他也在建议创建一个BPF的试验性版本,称之为xBPF,这个版本的限制更加少。例如xBPF可以支持更大的stack frame,也可以有indirect call instruction(间接调用指令)。参数可以直接通过stack传递,从而增加了函数可以使用的参数数量。他还希望能支持带符号数的除法。

为什么需要创建一个xBPF呢?这里主要的吸引力来自于可以执行更详尽的编译器测试。目前来说,他得关闭几百个GCC test,因为BPF根本没法运行这些测试。此外xBPF还能让调试更加容易,能容易生成backtrace。还会让去除verifier的各种限制的试验过程更加容易一些。并且,xBPF会可以使用各种ELF链接功能。他很想让LLVM也能支持xBPF。

接下来,他会希望能有一个verifer运行在user space。BPF verifier的代码是相当复杂精致,能有一个user space版本的话,就可以更容易的发现问题。他并不打算重新开发一个verifier,而是希望能有什么办法直接利用kernel的verifier代码。

最后Marchesi问道,BPF ABI是什么?目前,它只能根据LLVM生成什么以及kernel接受什么来决定。我们需要对BPF建立文档描述清楚这个ABI,只有这样才能让多种实现版本(无论是LLVM还是GCC生成)都可以互相协作。随着BPF使用越来越广泛,他很希望能投身其中,为GNU toolchain做更多贡献。

[Your editor thanks the Linux Foundation, LWN's travel sponsor, for supporting travel to this event.]

全文完

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

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

从0搭建LoRaWAN服务器ChirpStack并模拟接入设备 ChirpStack是一个著名的开源LoRaWAN服务器,目前已经实现了和ThingsPanel的对接。本文讲述如何从零搭建ChirpStack,并使用LWN-Simulator模拟器来模拟设备接入。 阅读详情

相关推荐

LLVM improvements for BPF verification

摘要:Alan Jowett在2024 Linux峰会上探讨如何改进LLVM对BPF程序的支持。当前LLVM优化生成的BPF代码常因校验器无法理解而失败,开发者不得不使用汇编代码规避。Jowett提出将MIT授权的PREVAIL校验器集成到LLVM流程中,但存在IR与字节码的转换难题。会议还讨论了代码覆盖率、分支提示保留等改进方向,但与会者在JIT优化复杂度等问题上存在分歧。由于BPF的特殊校验要求与传统编译器目标存在矛盾,解决方案仍需持续探索。

mounter625的专栏 951

LWN:GCC也支持BPF了!

关注了就能看到更多这么棒的文章哦~BPF in GCCBy Jake EdgeSeptember 15, 2020LPC原文来自:https://lwn.net/Articles/831...

Linux News搬运工 1199

Linux内核编译指南:从环境准备到性能优化

Linux内核作为操作系统的核心组件,其编译过程是系统管理员和开发者的重要技能。内核编译技术涉及工具链配置、源码获取、选项定制等关键环节,通过合理配置可以显著提升硬件兼容性和系统性能。在云计算和嵌入式领域,内核定制能优化资源利用率,例如针对特定CPU架构的调度器调优可带来5%以上的性能提升。实践中常见场景包括驱动开发(如WiFi6网卡支持)、实时系统构建(CONFIG_PREEMPT_RT配置)以及安全加固。Ubuntu等发行版虽然提供预编译内核,但手动编译能解决硬件兼容性问题,如Intel Arc显卡支持

weixin_34245082的博客 355

基于c语言的BPF程序

当你在使用BPF程序时,你需要去指定哪种类型的程序在运行。类型将会告诉程序,你的代码将在内核的哪个地方被执行。同时,它也会告诉BPF虚拟机的verifier,哪种类型的bpf helper将会被允许使用。当你选择了程序类型,你同时也选择了你的代码要实现的相关接口。该接口将确保你可以访问你想要的数据、想要获取的网络包等等。 1.开始你的第一个BPF程序 BPF程序的编译,一般使用LLVM.LLVM是一种genreal-purpose 的编译器,LLVM可以emit不同的字节码。在本章中,LLVM将生成bpf的

zhjwang的博客 3008

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7989

保姆级CVE-2018-17066漏洞复现 DLink命令注入漏洞(更新完结)

之后按照之前复现的方式一样 我们丢到kali中执行binwalk解析。之后为了模拟 可以在kali里安装qemu-mipsel。在bin目录下可以尝试将goahead的环境搭配好。固件官网可以进行下载。

weixin_51339377的博客 882

BPF学习笔记(三)--BPF示例程序

上一篇文章中BPF的例子是以BCC的整体框架为基础,本篇介绍一下基于libbpf库函数为基础,结合内核中的bpf的sample为基础编写一个BPF的程序,本篇介绍是以《linux-observability-with-bpf》这本书第二章的例子为基础,由于内核版本的不同,本篇介绍是以Linux5.16内核为基础,Linux5.16内核中的接口函数与书中的给到的程序案例有较大的差别。2)随着bpf和内核版本的不断变化,参考本文时需要重点关注不同的内核版本、bpftool、gcc等各类工具的版本。

frankzfz的专栏 2967

基于奥比中光Orbbec Astra Pro与ROS实现实时3D环境建模:orb_slam2实战指南

本文提供了一份详细的实战指南,介绍如何使用奥比中光Orbbec Astra Pro深度摄像头与ROS系统,部署并运行ORB-SLAM2算法,实现实时3D环境建模与定位。内容涵盖从驱动安装、环境配置、算法编译到摄像头标定与性能调优的全流程,旨在帮助开发者快速搭建一套高性价比的视觉SLAM系统。

weixin_29054399的博客 335

LWN:GCC BPF 支持的进展!

然而,朝着这个目标前进的过程中,发现了一些 Clang 支持 BPF 的问题,需要进行长时间的讨论,以便为这两个项目找到前进的道路。目前,Ihor Solodrai 维护着 bpf-next 树的持续集成测试(他稍后在会议期间对此进行了介绍),该测试会测试每个提交的补丁,以确保验证器接受的内容没有退化。Song 说,这种 Clang 行为既是故意的,也是 BPF 特定的;他们说,如果外部结构是 CO-RE 可重定位的,那么从逻辑上讲,内部结构也应该是 CO-RE 可重定位的,无论它是如何进入该结构的。

Linux News搬运工 1600

Vue3实战:企业级应用集成钉钉扫码登录全流程解析

本文详细解析了在Vue3企业级应用中集成钉钉扫码登录的全流程。从钉钉开放平台应用创建与配置,到Vue3前端如何优雅地嵌入并管理扫码组件,再到后端如何安全地处理OAuth 2.0授权码以换取用户信息并完成登录,提供了完整的实战代码与避坑指南。该方案能有效实现安全便捷的单点登录,统一企业身份认证。

weixin_29019241的博客 289

【Qt-4】QT基于qhttp-server搭建http服务器

QT搭建http服务器

WXG1011的博客 5712

LWN:BPF与安全!

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

Linux News搬运工 1077

指纹浏览器降维打击(下):Cloudflare Turnstile 与 hCaptcha 的底层交互逻辑

本文将深度拆解:Turnstile 与 hCaptcha 的 Iframe 沙箱通信机制,动态混淆 JS 与 PoW(工作量证明)的物理破解法则,以及如何通过 C++ 底层事件合成与环境基因强绑定,实现验证码的“无感过验”。

数据知道的博客 422

LWN:针对有验证功能的目标平台进行编译!

关注了就能看到更多这么棒的文章哦~The challenge of compiling for verified architecturesBy Jonathan CorbetOctober 6, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946254/在表面上来看,BPF虚拟机与许多其他计算机体系结构很相似;它具有寄存器,也有...

Linux News搬运工 648

Deep SHAP 深度学习模型的可解释性分析

Deep SHAP 算法是一种用于解释深度学习模型的技术, 该算法通过将每个特征的重要性与输出值相关联来进行解释。本博客对深度学习的模型可解释性进行了分析。

cnjs1994的博客 5119

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8125

LWN:对2024所做预测的回顾!

关注了就能看到更多这么棒的文章哦~A 2024 retrospectiveBy Jonathan CorbetDecember 25, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/1002368/通常人们说的疯狂(insanity),就是重复同样的行为却期待不同的结果。尽管如此,LWN 每年年初都会进行一组预测,然后在年末不得不...

Linux News搬运工 955

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LWN:对2024年的预测!

关注了就能看到更多这么棒的文章哦~LWN's guide to 2024By Jonathan CorbetJanuary 2, 2024ChatGPT translationhttps://lwn.net/Articles/954544/时光荏苒,日历已经翻到 2024 年,又迎来了新的一年。在 LWN,我们对于这一年将带来什么,其实并不比其他人知道更多,但这并不妨碍我们冒险来尝试进行一些预测。...

Linux News搬运工 366

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LWN:6.9合并窗口的第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.9 merge windowBy Jonathan CorbetMarch 14, 2024ChatGPT translationhttps://lwn.net/Articles/965141/截至撰写本文时,已将超过 4900 个非合并的变更集合并到了主线内核以准备发布 6.9 版本。这项工作包括了内核代码各处的一...

Linux News搬运工 253

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

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

LWN:GNU Tools Cauldron 上的内核开发者们!

关注了就能看到更多这么棒的文章哦~Kernel developers at CauldronBy Jonathan CorbetSeptember 18, 2024CauldronGemini-1.5-flash translationhttps://lwn.net/Articles/990379/Linux 系统由大量相互依赖的组件组成,所有组件都必须良好地相互支持。因此,令人惊讶的是,似乎这些...

Linux News搬运工 1047

LWN:统一kernel tracing处理!

Unifying kernel tracingByJake EdgeOctober 30, 2019OSS EU本文译自:https://lwn.net/Article...

Linux News搬运工 1926

LWN:内核中Rust支持的下一步动作!

关注了就能看到更多这么棒的文章哦~Next steps for Rust in the kernelBy Jonathan CorbetSeptember 19, 2022Maintainers SummitDeepL assisted translationhttps://lwn.net/Articles/908347/Rust for Linux 这个项目是希望今后可以使用 Rust 编程语言...

Linux News搬运工 352

LWN: 迫在眉睫的版本号修改!

关注了就能看到更多这么棒的文章哦~The imminent stable-version apocalypseBy Jonathan CorbetFebruary 5, 2021DeepL...

Linux News搬运工 310

ebpf教程(2):使用libbpf-bootstrap构建eBPF应用程序【译】

使用libbpf-bootstrap构建BPF应用程序【译】

大草的博客 4404

bpf编程系列之一:hello world

bpf程序由两部分组成,一个是内核态执行程序,一个是用户态执行程序,二者并不是直接链接的,可以看成是两个程序。linux内核为方便测试和提供样例,为用户态的接口、文件操作封装了一些helper函数,本次hello world程序里就用到了read_trace_pipe这个函数,我将涉及的辅助库文件贴在下方。bpf程序是在内核的bpf虚拟机运行的,它的。基于上述描述的,内核态程序是一个bpf类型的.o文件,用户态程序是一个可执行文件,生成相应程序的makefile如下,执行。,不是一个用户态可执行的文件。

绿水白川的博客 1296

透视Linux内核 神奇的BPF二

一 前言对于第一次BPF的介绍,只是简单介绍了BPF,写了一个没啥用的例子,如何利用BCC写一个有点用的程序以及BCC中有哪些牛逼的工具,是本篇需要介绍的。二 BPF程序开发一般流程再来回...

2085
上一篇: LWN: multipath TCP的现状
下一篇: LWN: 内核5.4版本合并窗口——第一部分
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值