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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-应用监控,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 该篇文章是记录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
AI 代码解读

Deebin安装

apt install clang
AI 代码解读

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

clang -v
AI 代码解读

2.2 安装linux-headers头文件

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

Centos安装

yum install kernel-headers
yum install kernel-devel
AI 代码解读

Deebin安装

apt install linux-headers
AI 代码解读

三、bpf打包

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

clang -target bpf -c load_elf__block_a_port.c -o load_elf__block_a_port.o
AI 代码解读

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

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

llvm-objdump -d  load_elf__block_a_port.o
AI 代码解读

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

yum install llvm
AI 代码解读

四、执行代码

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!("----------------------------------------------");
AI 代码解读

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

相关文档:elf文档

SEC(".classifier")
int handle_ingress(struct __sk_buff *skb)
AI 代码解读

所以上面通过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

盹猫
+关注
目录
打赏
0
0
0
0
23
分享
相关文章
Centos安装Python3.7(亲测可用)
本指南详细介绍了在基于Linux(以CentOS系统为例,使用yum包管理器)的系统上安装Python 3.7版本的完整流程。Python是一种广泛使用的高级编程语言,在各种领域如软件开发、数据分析、人工智能和区块链开发等都有着重要的应用。
99 2
|
22天前
|
IntelliJ IDEA 使用技巧与插件推荐
IntelliJ IDEA 是一个功能强大、扩展性丰富的开发工具。通过掌握常用的快捷键和技巧,结合合适的插件,可以大幅提升你的开发效率。
64 0
|
22天前
|
rbpf虚拟机-验证器(verifier)
该篇文章是rbpf虚拟机验证器代码块功能的整理。(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)
85 23
快速解决Nginx跨域问题
项目场景:在集成nginx代理反向代理时,出现的跨域问题的解决方法。
145 1
|
22天前
|
SpringBoot应用-Actuator监控
Spring Boot Actuator 是 Spring Boot 提供的一个独立模块,旨在通过简单的方式提供应用程序的监控和管理功能。Actuator 内置了多种端点(Endpoints),可以用于查看应用的健康状况、配置属性、日志级别等。
100 0
|
22天前
|
关于引入maven项目后出现‘parent.relativePath’ of POM错误时的解决方法
关于引入maven项目后出现‘parent.relativePath’ of POM错误时的解决方法
110 3
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
111 2
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
144 3
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
101 0

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问