LuaJIT Bytecode结构布局

news2024/12/26 22:20:33

一、Bytecode的存储结构

LuaJIT的Bytecode位宽为32位,在parse阶段用结构体BCInsLine表示,ins表示32位长的字字节码指令,line表示字节码的行号:

typedef struct BCInsLine {
  BCIns ins;            /* Bytecode instruction. */
  BCLine line;          /* Line number for this bytecode. */
} BCInsLine;

parse阶段的Bytecode指令集被存放在一个BCInsLine类型的动态数组中,数组的初始sizeLJ_MIN_VECSZ(值为8),每次动态扩充的大小为 size<< 1,最大扩充至LJ_MAX_BCINS(1<<26)FuncState->bcbase指向数组的基地址。以下字节码parse时在内存中的存放方式如图所示:

0001    KSHORT   0 132
0002    GSET     0   0      ; "a"
0003    KSTR     0   1      ; "qwer"
0004    GSET     0   2      ; "str"
0005    GGET     0   0      ; "a"
0006    SUBVN    0   0   0  ; 1
0007    GSET     0   0      ; "a"
0008    RET0     0   1

在这里插入图片描述
等parse完成后,会将Bytecode指令集重新组织,放入一个BCIns 类型的数组中,数组的size为Bytecode指令的条数,基地址为(BCIns *)((char *)pt + sizeof(GCproto)),这一过程在lj_parse.c:fs_finish函数中。这么做的原因也就是让取指令操作具有一个良好的空间局部性,下图为Bytecode指令集放入重新组织的数组中的结构:
在这里插入图片描述
假设现在有两个寄存器PC和INS,PC存放Bytecode的地址,INS存放PC对应地址处的Bytecode值,则可以利用以下伪代码对Bytecode访问,其中code_base是存放Bytecode连续内存(数组)的首地址:

mov  PC  code_base
load  INS  [PC]
...
// set INS to next bytecode
add  PC  PC  4
load  INS  [PC]
...

二、Instruction dispatch table

DynASM会将vm_loongarch64.dasc中的汇编代码在预处理阶段变成二进制机器码,然后再使用内存映射将机器码映射到虚拟内存,等运行时便可以直接运行被映射的二进制代码。在lj_dispatch.h中有一个结构GG_State,定义如下:

typedef struct GG_State {
  lua_State L;                          /* Main thread. */
  global_State g;                       /* Global state. */
#if LJ_HASJIT
  jit_State J;                          /* JIT state. */
  HotCount hotcount[HOTCOUNT_SIZE];     /* Hot counters. */
#endif
  ASMFunction dispatch[GG_LEN_DISP];    /* Instruction dispatch tables. */
  BCIns bcff[GG_NUM_ASMFF];          /* Bytecode for ASM fast functions. */
} GG_State;

字段dispatch是一个ASMFunction数组,而ASMFunction是函数指针类型,是Bytecode指令对应的汇编函数。运行时被映射的二进制代码的地址(函数指针),存放在dispatch数组中,且数组的下标为BCOp(定义在lj_bc.h中),存放与其对应的汇编函数指针。如dispatch[BC_POW]中存放函数指针为vm_loongarch64.dasc:BC_POW函数在虚拟内存中的映射地址。

解释器在解释执行Lua原型(GCproto)生成Bytecode指令集时,如Bytecode的存储结构中的指令集。首先从GCfuncL->pc内存地址处中取出第一条Bytecode指令(BC_FUNCF rbase lit),取出该指令的opcode(BC_FUNCF),以opcode为index在dispatch中查找相应的函数指针,再执行相应的函数。等解释执行的逻辑完成,开始让PC指向下一条Bytecode指令,重复同样的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React性能优化API

一、常见性能优化API shouldComponentUpdate&#xff1a;通过重写该函数实现组件的条件渲染&#xff0c;即只有在组件的 props 或 state 发生变化时才重新渲染组件。 PureComponent&#xff1a;React 自带的一个纯组件&#xff0c;其 shouldComponentUpdate 函数已经被自动实现…

向量数据库发展迎里程碑时刻!Zilliz Cloud 全新升级:超高性价比,向量数据库唾手可得

随着 Zilliz Cloud[1] 版本全新升级&#xff0c;向量数据库再度迎来里程碑式发展&#xff01; 升级后的 Zilliz Cloud 不仅新增了诸如支持 JSON 数据类型、动态 Schema 、Partition key 等新特性&#xff0c;而且在价格上给出了史无前例的优惠&#xff0c;例如推出人人可免费使…

基于Java网络游戏公司官方平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

p5.js 开发点彩画派的绘画工具

theme: smartblue 本文简介 点赞 关注 收藏 学会了 这几天在整理书柜时看到这套书&#xff0c;看到梵高&#xff0c;想起他的点彩画。 想到点彩画派&#xff0c;不得不提的一个画家叫乔治皮埃尔秀拉。据说梵高也模仿过他的画作。 我引用一下维基百科对点彩画派的解析&#x…

一文读懂功率信号源(信号发生器)

功率信号源是一种用于产生高功率信号的电子设备&#xff0c;它广泛应用于各个领域&#xff0c;在生产、测试和调试中起着重要的作用。下面就让安泰将介绍功率信号源的基本概念、工作原理、分类以及应用。 功率信号源是一种能够产生稳定输出功率的设备。它通常由一个稳压电源和一…

图解LeetCode——200. 岛屿数量

一、题目 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格…

还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!

需求 最近写了一个服务&#xff1a;根据优惠券的类型resourceType和编码resourceId来 查询 发放方式grantType和领取规则 实现方式&#xff1a; 根据优惠券类型resourceType -> 确定查询哪个数据表 根据编码resourceId -> 到对应的数据表里边查询优惠券的派发方式gran…

MAC卸载深信服edr

一、普通办法 1、首先在应用程序中找到终端防护中心&#xff0c;右键显示原项目。 2、全选删除所有文件&#xff0c;其中有一个sfavtray文件无法删除&#xff0c;这里先删除其他文件&#xff0c;不然底3步结束进程会自动恢复。 3、在活动监视器中查找进程名为sfavtray、edr的进…

DuiLib了解 XML使用和布局控制

文章目录 1、了解 XML使用和布局控制2、内外边距3、浮动4、占位符5、默认样式6、全局字体 1、了解 XML使用和布局控制 通过上一篇的学习我们可以制作一个简单的布局了&#xff0c;但是没有控件的窗口做再好的布局有什么用呀。赶紧找些素材&#xff0c;我们来做一个标准的 Wind…

什么是指标拆解树?指标拆解树怎么做数据分析?

指标拆解树能够通过对指标进行拆解&#xff0c;帮助分析定位影响指标的关键因素。 通过指标拆解树&#xff0c;您可以方便查看各个维度中各个成员对指标的贡献情况和占比&#xff0c;也可以将指标分解到一个或多个维度&#xff0c;分析每个维度对指标的影响。 指标拆解树的数据…

Spring Boot单体应用引入sleuth链路追踪

文章目录 前言一、问题模拟二、引入sleuth链路跟踪1、引入sleuth的maven依赖2、添加属性配置3、logback配置4、日志信息5、通过NewSpan注解声明新的Span 三、引入Sleuth链路跟踪的好处四、Sleuth概念说明五、Logback的MDC特性 前言 最近排查生产环境的异常时发现一个问题&…

Unreal 5 实现丧尸追逐攻击功能

要实现让丧尸能够智能的追逐玩家&#xff0c;我们需要用到ue封装的ai行为树来实现。基础相关的请查看&#xff1a;Unreal Engine 5.1 AI行为树基础入门&#xff0c;来学习一下如何使用ai行为树来实现一个简单的追逐功能。这一篇就是基于这个基础上进行了优化&#xff0c;实现了…

Docker专题系列之十一:基于Docker安装配置Nacos

一、查找镜像 使用如下命令查找镜像库中的资源 docker search nacos二、拉取镜像 拉取最新版本的nacos镜像 docker pull nacos/nacos-server三、查看镜像文件 docker images四、创建本地数据卷目录 mkdir /usr/rdc mkdir /usr/rdc/nacos mkdir /usr/rdc/nacos/logs五、创…

qt_多人聊天

服务器 .pro QT core gui network widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //客户端容器链表 #in…

【SpringMVC】SSM整合

1&#xff0c;SSM整合 前面我们已经把Mybatis、Spring和SpringMVC三个框架进行了学习&#xff0c;今天主要的内容就是把这三个框架整合在一起完成我们的业务功能开发&#xff0c;具体如何来整合&#xff0c;我们一步步来学习。 1. 流程分析 (1) 创建工程 创建一个Maven的web…

【IE】浏览器兼容问题IE

IE11浏览器 1.安装npm i babel-polyfill -S 2.main.js引入&#xff1a; import “babel-polyfill” 3.build/webpack.base.conf.js 更改 : entry: { app: [‘babel-polyfill’, ‘./src/main.js’] } 以上操作之后IE11依旧空白&#xff0c;报错 缺少标识符 axios版本V1.1.3 …

手把手教你搭建一个vue3+ts项目(超祥/必看)

目录 一、创建vite项目 二、启动vite项目 三、处理一些配置问题 四、增加工程化插件 1、安装sass 2、安装vue-router 3、安装pinia 4、安装element-plus 5、安装axios 6、设置路径别名&#xff0c;将相对路径改为绝对路径 一、创建vite项目 1、在一个文件夹下通…

React基础教程(二):React的基本使用

React基础教程(二)&#xff1a;React的基本使用 1、HelloReact 1.1 引入react基础依赖包 注意点&#xff1a;①必须要在②之前引入 <!-- 引入react核心库--><script src"../js/react.development.js"></script><!-- 引入react-dom&…

毕业论文里引用文献率为0%的解决小技巧

快要毕业了&#xff0c;带着伤感&#xff0c;大学生们已开始加紧完成论文的编写和毕业答辩&#xff0c;祝大家都可以顺利拿到学位证书和毕业证书。 前两天&#xff0c;有位同学找我&#xff0c;咨询如何解决毕业论文里&#xff0c;引用文献率为0%的问题。 我在知网上将该论文通…

flutter创建、安装扩展包、打包apk

1、创建APK项目 要在VSCode中创建一个Flutter应用程序&#xff0c;请按照以下步骤进行操作&#xff1a; 安装Flutter SDK&#xff1a;请确保你已经安装了Flutter SDK&#xff0c;并配置了Flutter的环境。你可以在Flutter的官方网站上找到安装和设置Flutter的详细说明。 安装V…