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个方面进行了详细讲解,既适合初学者系统学习以太坊的原理和应用开发,又适合有一定基础的开发者深入掌握以太坊的底层运行机制。
|
新零售 人工智能
阿里巴巴联合汉仪重磅推出五款人工智能字体:汉仪天真体、英雄体等
众所周知传统做字的人力成本非常之高,如果全靠人类设计师来完成,一套标准字库从设计到完成需要一年多的时间。
13855 0
网站备案工信部短信核验操作流程
阿里云网站备案工信部短信核验操作流程,网站备案通过阿里云初审后后提交到管局,需要进行工信部短信核验
1892 0
网站备案工信部短信核验操作流程
|
2月前
|
监控 Java Nacos
微服务流量治理实战: Sentinel 和 MSE的熔断降级艺术
Sentinel 是阿里巴巴开源的流量治理组件,在微服务高并发场景中承担限流、熔断、降级三大核心职责。阿里云 MSE 提供了 Sentinel 的托管规则推送和集群限流增强。本文从电商秒杀场景出发,实战演示 Sentinel 核心功能:QPS 限流、线程池隔离、熔断降级、热点参数限流、系统自适应保护,以及 Nacos 规则持久化和 MSE 托管方案,并给出生产环境的最佳实践。
|
3月前
|
人工智能 前端开发 JavaScript
告别排版烦恼,让公众号写作效率翻倍:TypeZen 完全指南
工欲善其事,必先利其器。TypeZen 的目标很简单:**让公众号创作者回归内容本身,把排版交给工具**。 如果你也是 Markdown 的重度用户,或者正在为公众号排版效率发愁,不妨试试 TypeZen。
411 1
告别排版烦恼,让公众号写作效率翻倍:TypeZen 完全指南
|
2月前
|
机器学习/深度学习 人工智能 弹性计算
通过阿里云服务器部署AI agent怎么选?OpenClaw与Hermes区别及选择建议参考
本文对比了两款可通过阿里云轻量应用服务器一键部署的AI Agent平台——OpenClaw与Hermes。OpenClaw定位为"日常事务万能工具箱",全面支持飞书、钉钉、企业微信等国内IM集成,适合办公自动化与团队协作,部署极简;Hermes则是"会自我进化的数字合伙人",擅长复杂任务拆解与深度研究,随使用持续学习优化,但不支持国内IM。选型建议:日常办公选OpenClaw,复杂研究选Hermes。当前阿里云轻量服务器2核2G低至38元/年、2核4G仅9.9元/月,新用户可享限时特惠,最低成本即可拥有专属AI助手。
|
2月前
|
人工智能 JSON 监控
AI Agent 面试被问爆了:工具调用和 Function Calling 到底怎么工作?
本文深度解析AI Agent工具调用与Function Calling的工程本质:阐明为何大模型必须依赖工具解决实时性、操作性与确定性短板;厘清Function Calling是结构化调用机制而非模型自执行;完整还原“定义工具→模型推理→程序执行→结果回传→多轮闭环”链路;并直击落地八大坑(如描述模糊、权限缺失、无降级、不可观测等),助力面试者穿透概念、展现真实工程思维。
|
4月前
|
JavaScript 前端开发 Java
事件与回调的协奏:写给开发者的Node.js运行机理漫谈
Node.js是基于V8引擎的JavaScript运行时,实现JS从浏览器沙箱到服务器端的“越狱”。它通过libuv异步I/O、事件循环、多线程/多进程等机制,支撑高并发;融合Buffer、Stream、C++扩展、AsyncLocalStorage等能力,构建高性能、全栈可用的现代运行环境。(239字)
362 1
|
4月前
|
Web App开发 Rust 安全
C++与Rust的共生——不是零和博弈的未来
C++与Rust的关系常常被描绘成一场战争:C++是过时的巨人,Rust是崛起的新星,两者争夺系统编程的王座。这种叙事虽然戏剧性,但严重歪曲了现实。
344 2