您的位置:首页 > 科技 > 能源 > seo需要掌握什么技能_网页制作是干嘛的_无忧seo博客_深圳新闻最新事件

seo需要掌握什么技能_网页制作是干嘛的_无忧seo博客_深圳新闻最新事件

2025/9/15 17:16:13 来源:https://blog.csdn.net/2202_75618418/article/details/146531438  浏览:    关键词:seo需要掌握什么技能_网页制作是干嘛的_无忧seo博客_深圳新闻最新事件
seo需要掌握什么技能_网页制作是干嘛的_无忧seo博客_深圳新闻最新事件

文章目录

  • 一、概述
  • 二、eBPF 的指令格式
  • 三、Opcode 具体字段解释
      • 1. 操作码(OP,7~4位)4位
      • 2. 访问模式(MODE,3~2位)2位
      • 3. 数据大小(SIZE,1~0位) 2位
  • 三、具体使用
  • 四、总结

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          |
+----------------------------------------+

字段说明:

字段位数说明
opcode8-bit操作码,包括 OP、MODE 和 SIZE
dst4-bit目标寄存器编号
src4-bit源寄存器编号(用于二元运算)
offset16-bit偏移量(用于内存访问或跳转)
immediate32-bit立即数(用于算术或跳转指令)

三、Opcode 具体字段解释

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

Opcode 值名称说明
0x00BPF_LD立即数/内存加载指令
0x40BPF_LDX从内存加载到寄存器
0x60BPF_ST存储指令(寄存器 → 内存)
0x61BPF_STX存储指令(寄存器 → 内存,带索引)
0x80BPF_ALU算术运算(立即数模式)
0xc0BPF_ALU6464 位算术运算
0xa0BPF_JMP跳转指令
0xe0BPF_JMP3232 位跳转指令

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

Mode 值名称说明
0x00BPF_IMM立即数模式(直接使用值)
0x10BPF_ABS绝对地址模式(用于 BPF_LD
0x20BPF_IND间接地址模式(用于 BPF_LD
0x60BPF_MEM内存模式(从内存读取/写入)
0x70BPF_LEN报文长度(仅在 BPF_LD 使用)

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

Size 值名称说明
0x00BPF_W4 字节(32 位)
0x08BPF_H2 字节(16 位)
0x10BPF_B1 字节(8 位)
0x18BPF_DW8 字节(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


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

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com