rbpf虚拟机-opcode码

简介: 该篇文章是rbpf虚拟机opcode码作用和使用的整理。(学习该虚拟机的目的是为了搞懂solana合约的执行方式,solana使用的rbpf是在该虚拟机上进行扩展。)

@[toc]

Welcome to Code Block's blog

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

一、概述

该篇文章是rbpf虚拟机opcode码作用和使用的整理。

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

经过验证器后在rbpf虚拟机需要知道每条指令是用来做什么的,就需要用到opcode码,opcode码中由8种操作码、5种访问模式、4种数据大小进行组合获得,其结构如下图:

  7   6   5   4   |  3   2   |  1   0  
+---------------+--------+--------+
|     操作码    |  访问模式  |  大小   |
+---------------+--------+--------+

二、eBPF 的指令格式

完整的 eBPF 指令通常是 8 字节(64 位),其中 opcode 仅占 低 8 位,其余部分包含寄存器编号、立即数等。

  31      24 23     16 15      8 7       0
+--------+--------+--------+--------+
|    dst  |    src  |  offset  |  opcode |
+--------+--------+--------+--------+
|           immediate / address          |
+----------------------------------------+

字段说明:
| 字段 | 位数 | 说明 |
|-------------|--------|---------|
| opcode | 8-bit | 操作码,包括 OP、MODE 和 SIZE |
| dst | 4-bit | 目标寄存器编号 |
| src | 4-bit | 源寄存器编号(用于二元运算) |
| offset | 16-bit | 偏移量(用于内存访问或跳转) |
| immediate | 32-bit | 立即数(用于算术或跳转指令) |


三、Opcode 具体字段解释

1. 操作码(OP,7~4位)4位

Opcode 值 名称 说明
0x00 BPF_LD 立即数/内存加载指令
0x40 BPF_LDX 从内存加载到寄存器
0x60 BPF_ST 存储指令(寄存器 → 内存)
0x61 BPF_STX 存储指令(寄存器 → 内存,带索引)
0x80 BPF_ALU 算术运算(立即数模式)
0xc0 BPF_ALU64 64 位算术运算
0xa0 BPF_JMP 跳转指令
0xe0 BPF_JMP32 32 位跳转指令

2. 访问模式(MODE,3~2位)2位

Mode 值 名称 说明
0x00 BPF_IMM 立即数模式(直接使用值)
0x10 BPF_ABS 绝对地址模式(用于 BPF_LD)
0x20 BPF_IND 间接地址模式(用于 BPF_LD)
0x60 BPF_MEM 内存模式(从内存读取/写入)
0x70 BPF_LEN 报文长度(仅在 BPF_LD 使用)

3. 数据大小(SIZE,1~0位) 2位

Size 值 名称 说明
0x00 BPF_W 4 字节(32 位)
0x08 BPF_H 2 字节(16 位)
0x10 BPF_B 1 字节(8 位)
0x18 BPF_DW 8 字节(64 位)

三、具体使用

opcode码有很多种,如果直接使用如:0x71表示从内存加载 1 字节到寄存器,在定义时如果使用:

LD_B_REG = 0x71

这读起来有点费力,不利于维护操作。为了解决这一问题,可以直接将上述的操作码、访问模式、数据大小进行预先定义,然后使用以下方式进行定义:

LD_B_REG = BPF_LDX | BPF_MEM | BPF_B

BPF_LDX表示从内存加载到寄存器,BPF_MEM表示内存模式,BPF_B表示1个字节。这时我们就可以清楚的知晓LD_B_REG为从内存加载 1 字节到寄存器。这样,哪怕不知道是什么值,也可以通过按位或计算得到
opcode(操作码).

LD_B_REG = BPF_LDX | BPF_MEM | BPF_B
         = 0x61 | 0x00 | 0x10
         = 0b0110 0001 | 0b0000 0000 | 0b0001 0000
         ------------------------------------------
         = 0b0111 0001   // 结果 = 0x71(十六进制)

四、总结

通过上述对opcode码结构进行解读,对opcode码有了更深刻的理解,同时这种结构组合按位或处理可以产生很多组合结果,该方法可以很好的运用到日常的其它语言项目中。

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

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

我的GitHub:forked


感谢您的点赞、关注、收藏!

目录
相关文章
|
数据库
阿里云DTS数据迁移和数据同步的差异性分析
阿里云DTS作为一款常用的数据库表迁移工具,提供了功能非常类似的两个功能:数据迁移、数据同步。阿里云DTS产品官网对这两个功能模块进行了简单的区分: 场景1:存量数据批量迁移,建议使用数据迁移功能。 场景2:增量数据实时同步,建议使用数据同步功能。 实际上,无论是数据迁移还是数据同步,都可以做 “结构初始化”+“全量数据迁移”+“增量迁移”,因此两者功能差异并不明显。笔者在多个项目实践DTS数据迁移,在简单需求场景下,将DTS的数据迁移、数据同步进行对比和总结。
|
网络协议 应用服务中间件 nginx
使用Dockerfile编写源码安装Nginx镜像
使用Dockerfile编写源码安装Nginx镜像
779 0
|
3月前
|
存储 弹性计算 人工智能
阿里云服务器配置价格表全览:2核2G至32核128G配置与年付月付价格解析
阿里云服务器作为国内主流的云算力服务,凭借丰富的实例规格、灵活的付费模式与普惠的优惠政策,覆盖个人开发者、中小企业至大型企业的全场景算力需求。其价格体系以实例规格为核心,结合存储、带宽、付费模式与优惠活动多维构成,从低至几十元的入门轻量实例到数万元的企业级高配置实例,形成完整的价格矩阵。本文将从价格构成、实例规格价格明细、付费模式、优惠政策、API价格查询与选型建议六大维度,全面解析阿里云服务器配置价格表,帮助用户精准匹配算力需求与预算,实现低成本上云。
565 3
|
9月前
|
存储 人工智能 弹性计算
一文读懂云服务器:工作原理与核心作用
云服务器通过虚拟化与分布式技术,将物理服务器集群转化为按需分配的弹性计算资源,解决资源浪费、降低部署门槛。支撑个人开发、企业运维及AI、直播、政务等千行百业,是数字经济的核心基础设施。
|
11月前
|
数据采集 数据挖掘 API
1688店铺所有商品API使用指南
本文详解1688店铺商品API的使用,涵盖接口摘要、概述、Python请求示例及注意事项。通过该API可获取商品列表、详情等核心数据,适用于店铺管理、ERP系统与数据分析。结合代码演示,助开发者快速完成对接,实现高效数据采集与应用。(239字)
|
7月前
|
存储 安全 数据管理
什么是冷数据?阿里云低成本冷数据存储解决方案
冷数据指长期保存、访问极少但具合规与历史价值的数据(如旧合同、备份等)。阿里云OSS提供标准/低频/归档/冷归档/深度冷归档五级存储,结合生命周期自动分层、数据湖分析及存算分离架构,大幅降本并保障安全合规。
1220 5
|
6月前
|
人工智能 测试技术
豆包怎么导出 Word?整理写作草稿、表格和办公内容的流程
豆包内容转Word需兼顾格式与审校:短文本可直接复制,含标题/表格/代码者推荐导出Markdown后用DeepShare等工具转换,确保结构完整;所有AI生成内容均须人工核对事实、删冗余、补案例,方可正式交付。
|
7月前
|
设计模式 Java Linux
Java I/O的演进——从BIO到NIO再到AIO的异步革命
Java I/O模型经历了从阻塞I/O(BIO)到非阻塞I/O(NIO)再到异步I/O(AIO)的演进,每一次演进都是对高并发、高吞吐量需求的回应。
346 1
|
7月前
|
人工智能
AI自媒体和笔记发布前必做的4项技术检测,漏一个就容易翻车(我的技术经验分享)
AI内容真相:非因AI写作,而因同质化高、敏感词多、标题乏力、AI痕迹明显。作者实测发现,8篇笔记阅读量不足500,根源在于缺失四大检测——AI率、同质化(超70%即难推)、敏感词、标题质量。工具是辅助,人工精修才是关键。
547 1
IDEA修改JDK版本
在IDEA中修改项目JDK版本的方法如下:1. 右键点击项目;2. 选择“Open Module Settings”,如图所示;3. 在弹出窗口中配置自定义的JDK路径。通过以上步骤,可轻松更改项目所使用的JDK版本,满足不同开发环境的需求。
4272 65