rbpf虚拟机-打包和代码执行

简介: 该篇文章是记录rbpf虚拟机执行文件打包和执行的过程。(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展)。

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
—— 专为开发者打造的宝藏基地,等你来探索!
这里有:


🔥 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
🎉 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
💎 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!


🚀 立即访问 → 盹猫猫的个人小站 ← 点击探索
🌟 说不定这里就有你寻找已久的技术秘籍哦~

Welcome to Code Block's blog

本篇文章主要介绍了
[rbpf虚拟机-打包和代码执行]
❤博主广交技术好友,喜欢我的文章的可以关注一下❤

一、概述

该篇文章是记录rbpf虚拟机执行文件打包和执行的过程。

(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)


二、依赖安装

2.1 clang安装

因为要对c代码进行编译,所以需要安装clang,它可以比较好的支持将c代码打包为.o文件,当然你也可以使用用其它语言的并配合不同的打包程序进行打包,这边使用c语言.对于不同的linux有不同的安装方法:

Centos安装

yum install clang

Deebin安装

apt install clang

安装完成后可以使用以下命令检查是否安装成功:

clang -v

2.2 安装linux-headers头文件

eBPF 程序通常需要与内核进行交互,因此需要使用内核提供的 BPF 接口和相关数据结构。这些接口和数据结构定义在内核头文件中。所以这里需要安装头文件,使用以下命令进行安装:

Centos安装

yum install kernel-headers
yum install kernel-devel

Deebin安装

apt install linux-headers

三、bpf打包

在打包时确保已经安装了上述的依赖文件,并使用以下命令进行打包:

clang -target bpf -c load_elf__block_a_port.c -o load_elf__block_a_port.o

-target:打包的目标文件为bpf文件。
-c: 要打包的c代码目标
-o:打包后的文件名称。

运行后会在当前目录中生成load_elf__block_a_port.o 文件。若要查看其机器码可以使用以下命令查看其反汇编码:

llvm-objdump -d  load_elf__block_a_port.o

这里需要用到llvm,使用以下命令安装:

yum install llvm

四、执行代码

4.1 文件加载

    let filename = "examples/load_elf__block_a_port.o";
    //获取文件路径
    let path = PathBuf::from(filename);
    println!("----------------------------------------------");
    println!("path:{:?}", path);
    //以elf文件的格式读取
    let file = match elf::File::open_path(path) {
     
        Ok(f) => f,
        Err(e) => panic!("Error: {:?}", e),
    };
    println!("file:{:?}", file);
    println!("----------------------------------------------");
    //具体的方法块
    let text_scn = match file.get_section(".classifier") {
     
        Some(s) => s,
        None => panic!("Failed to look up .classifier section"),
    };
    println!("text_scn:{:?}", text_scn);
    let prog = &text_scn.data;
    println!("----------------------------------------------");

rbpf虚拟机执行的是字节码,所以这里需要对文件进行读取,使用elf库可以将.o类型的bpf文件读取为json,上述代码中的file即为json格式。在未编译的c文件中,使用SEC进行标识section方法。

相关文档:elf文档

SEC(".classifier")
int handle_ingress(struct __sk_buff *skb)

所以上面通过file.get_section(".classifiler")可以获取这个具体执行的方法。通过.data获取方法的字节码。

4.2 运行

有了字节码数据,就可以通过vm.execute_program方法对字节码程序进行执行。
具体执行可参考:rbpf虚拟机-JIT和解释执行


五、总结

因为solana合约执行的虚拟机是建立在rbpf虚拟机之上的,通过对rbpf虚拟机打包和代码执行,可以想到,solana的使用rust打包完成和部署的so文件,其本质和原理类似对.o文件的打包。其代码的执行原理,也类似于对字节码数据的执行。

代码来源:rbpf虚拟机
鸣谢: qmonnet 提供的开源代码.

当然,我也会将带有中文注释和自己理解的一些代码上传的我的github页面,感兴趣的朋友可以进行clone查看.

我的GitHub:forked

目录
相关文章
|
区块链 数据安全/隐私保护 缓存
带你读《深入理解以太坊》之三:技术架构
这是一本从原理和实践两个层面系统、深入讲解以太坊技术的专著,从设计理念、技术架构、共识算法、智能合约、以太坊虚拟机、开发工具、DApp开发、企业以太坊解决方案、跨链技术等近10个方面进行了详细讲解,既适合初学者系统学习以太坊的原理和应用开发,又适合有一定基础的开发者深入掌握以太坊的底层运行机制。
|
新零售 人工智能
阿里巴巴联合汉仪重磅推出五款人工智能字体:汉仪天真体、英雄体等
众所周知传统做字的人力成本非常之高,如果全靠人类设计师来完成,一套标准字库从设计到完成需要一年多的时间。
13963 0
网站备案工信部短信核验操作流程
阿里云网站备案工信部短信核验操作流程,网站备案通过阿里云初审后后提交到管局,需要进行工信部短信核验
2018 0
网站备案工信部短信核验操作流程
|
4月前
|
网络协议 API 数据安全/隐私保护
阿里云百炼按量付费 API Key 获取教程:附TokenPlan和Coding Plan密钥获取方法
本文详解阿里云百炼按量付费API Key获取流程:登录控制台→开通服务→进入API Key管理页→选择地域(推荐北京)→创建并配置权限(全部或自定义IP/模型白名单)→立即复制保存sk-开头密钥(仅显示一次)。Token/Coding Plan用户需用专属sk-sp-密钥。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
|
4月前
|
存储 缓存 自然语言处理
从一次修复到长期记忆:Agent 工作流里的知识沉淀
Thinkroom 提出“知识复用”替代传统“代码复用”,将每次问题解决沉淀为结构化、机器可读的 `Learning`(Markdown 文档),嵌入研发全流程:调试后自动捕获、规划前智能检索、编码时强制遵循、审查中实时校验。知识按持久性分级存储,辅以防腐机制与毫秒级 Grep-First 检索,让历史经验真正驱动下一次开发——知识不再沉睡于 Wiki,而活在工作流中。
327 0
|
5月前
|
监控 Java Nacos
微服务流量治理实战: Sentinel 和 MSE的熔断降级艺术
Sentinel 是阿里巴巴开源的流量治理组件,在微服务高并发场景中承担限流、熔断、降级三大核心职责。阿里云 MSE 提供了 Sentinel 的托管规则推送和集群限流增强。本文从电商秒杀场景出发,实战演示 Sentinel 核心功能:QPS 限流、线程池隔离、熔断降级、热点参数限流、系统自适应保护,以及 Nacos 规则持久化和 MSE 托管方案,并给出生产环境的最佳实践。
|
5月前
|
存储 数据采集 机器人
具身智能爆发背后,存储如何成为关键基础设施?
具身智能爆发式发展带来存储新挑战:多模态数据采集、仿真生成、清洗标注、分布式训练与低延迟推理各环节诉求迥异。阿里云以 OSS 统一底座(支持 QoS 管控、冷热分层、Vector Bucket 向量检索)+ CPFS 高性能训练引擎协同,构建全链路、高弹性、低成本存储方案。
883 0
具身智能爆发背后,存储如何成为关键基础设施?
|
6月前
|
人工智能 前端开发 JavaScript
告别排版烦恼,让公众号写作效率翻倍:TypeZen 完全指南
工欲善其事,必先利其器。TypeZen 的目标很简单:**让公众号创作者回归内容本身,把排版交给工具**。 如果你也是 Markdown 的重度用户,或者正在为公众号排版效率发愁,不妨试试 TypeZen。
691 1
告别排版烦恼,让公众号写作效率翻倍:TypeZen 完全指南
|
5月前
|
人工智能 JSON 监控
AI Agent 面试被问爆了:工具调用和 Function Calling 到底怎么工作?
本文深度解析AI Agent工具调用与Function Calling的工程本质:阐明为何大模型必须依赖工具解决实时性、操作性与确定性短板;厘清Function Calling是结构化调用机制而非模型自执行;完整还原“定义工具→模型推理→程序执行→结果回传→多轮闭环”链路;并直击落地八大坑(如描述模糊、权限缺失、无降级、不可观测等),助力面试者穿透概念、展现真实工程思维。
|
7月前
|
JavaScript 前端开发 Java
事件与回调的协奏:写给开发者的Node.js运行机理漫谈
Node.js是基于V8引擎的JavaScript运行时,实现JS从浏览器沙箱到服务器端的“越狱”。它通过libuv异步I/O、事件循环、多线程/多进程等机制,支撑高并发;融合Buffer、Stream、C++扩展、AsyncLocalStorage等能力,构建高性能、全栈可用的现代运行环境。(239字)
508 1