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

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

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

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

frankzfz的专栏 2967

别再浪费主板上的PCIE插槽了!手把手教你用VL805芯片打造高速USB3.0扩展坞

本文详细介绍了如何利用VL805芯片将主板闲置的PCIE插槽改造为高性能USB3.0扩展坞。从芯片选型、电路设计到焊接工艺和系统调试,提供了一套完整的实战指南,帮助用户充分释放硬件潜能,实现高达5Gbps的传输速度。

weixin_27134495的博客 326

LWN:GCC BPF 支持的进展!

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

Linux News搬运工 1600

LLC混合滞回控制 vs 电压模/电流模:UCC25640x仿真对比与选型指南

在开关电源设计中,LLC谐振变换器的环路补偿是核心难点。传统电压模控制(VMC)和电流模控制(CMC)在LLC拓扑上存在环路增益漂移、动态响应慢等局限。混合滞回控制通过滞回比较器直接调制开关频率,并融合输出电压与谐振腔电流信息,实现了自适应环路增益和快速瞬态响应。该技术显著提升轻载效率与动态性能,适用于高密度适配器、快充及车载充电机等场景。本文基于UCC25640x系列,通过仿真对比三种控制策略,为工程选型与调试提供实践参考。

weixin_33925615的博客 334

七天征服AutoSAR/SomeIP_01速成配置并代码生成

本文为AutoSAR中SomeIP配置开发的实操指南摘要,重点介绍通过通信矩阵快速构建SomeIP工程的方法。核心内容包括:1)基于Excel通信矩阵生成系统描述文件(arxml);2)在AutoSAR工具中导入文件自动生成协议栈配置,涵盖ETHIF、SoAd等模块;3)关键报错处理(COM/PDUR/SOAD/SD模块的配置修正);4)SomeIPXF的数据编解码配置;5)SWC组件与RTE任务映射。教程强调"先完成再完美"的实践原则,指导开发者快速生成基础代码框架,为后续协议调试奠定

大叔带刺的博客 303

LWN:BPF与安全!

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

Linux News搬运工 1077

基于Python的车牌识别系统实现

本文将以基于Python的车牌识别系统实现为方向,介绍车牌识别技术的基本原理、常用算法和方法,并详细讲解如何利用Python语言实现一个完整的车牌识别系统。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 5万+

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

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

Linux News搬运工 648

低代码部署与管理——OpenClaw智能助手的应用部署与运维(2026技术版)

OpenClaw智能助手的低代码部署与管理平台采用分层架构设计,包含部署工具、环境管理、版本控制等核心模块,支持从开发到生产的全流程自动化部署。该系统通过Docker、Kubernetes等技术实现应用构建和部署,利用Terraform等工具管理多环境配置,并提供完善的监控运维能力。平台针对开发、测试、预生产和生产环境提供差异化配置,确保部署效率和运行可靠性。这种架构设计遵循自动化、可扩展性和安全性原则,显著提升了智能助手应用的部署效率和运维质量。

一键难忘的博客 318

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

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

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

Linux News搬运工 955

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LWN:对2024年的预测!

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

Linux News搬运工 366

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值