chunk总体结构(头部)

本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~

二进制chunk主要分为两部分:

可以使用 xxd 命令观察一下 luac 文件

$ xxd -u -g 1 hello_world.luac

00000000: 1B 4C 75 61 53 00 19 93 0D 0A 1A 0A 04 08 04 08 .LuaS......
00000010: 08 78 56 00 00 00 00 00 00 00 00 00 00 00 00 00 .xV........

1.头部
头部共占用30个子节(因平台而异)

其中包含:
a.签名
很多二进制格式都会以固定的魔数开始(Magic Number)开始
(Java的class文件,魔数是四字节0xCAFEBABC)
Lua二进制chunk的魔数(也叫做签名,Signature)也是四个字节码,分别是 ESC、L、u、a 的ASCII码
十六进制表示是0x1B4C7561,字符串就是\x1bLua
其主要作用就是快速识别文件格式的作用
当Lua虚拟机试图加载一个chunk文件,发现其不是以这个开头的,就会拒绝加载文件

b.版本号
签名之后的一个字节,记录二进制chunk文件所对应的Lua版本号
有三个部分构成:

  1. 大版本号(Major Version)
  2. 小版本号(Minor Version)
  3. 发布号(Release Version)仅仅用来修复bug
    Lua中的版本号是算出来的=大版本号*16+小版本号(乘16是为了凑16进制)
    比如:5.3.4 -> 5x16+3=83 -> 0x53

c.格式号
版本号之后的一个子节记录二进制chunk格式号
Lua加载二进制chunk时,也会检查格式号
如果和虚拟机本身的格式号不匹配,就拒绝加载该文件
Lua官方使用的格式号是 0

d.LUAC_DATA
格式号之后的六个字节在Lua官方实现里叫LUAC_DATA
其中前两个字是0x1993,这是Lua 1.0发布的年份
后四个子节依次是:回车符(0x0D)、换行符(0x0A)、替换符(0x1A)和另一个换行符
同样也是校验的作用,如果虚拟机加载二进制chunk时发现这六个字节不一样,就会认为文件损坏,拒绝加载

e.整数和Lua虚拟机指令宽度
接下来的几个数分别记录 cint、size_t、Lua虚拟机指令、Lua整数和Lua浮点数这五种数据类型,在而微软禁止chunk里占用的字节数。
同样也会检查这五种数据所占用的字节数,如果和期望数值不匹配则拒绝加载

f.LUAC_INT
解析来的n个子节存放 Lua 整数值 0x5678
是为了检验二进制 chunk 的大小端方式,Lua 会用虚拟机在加载二进制 chunk 时,会利用这个数据检查其大小端方式和本机是否匹配,如果不匹配就会拒绝记载

g.LUAC_NUM
头部的最后 n 个子节存放 Lua 浮点数 370.5
同样是为了检测二进制 chunk 所使用的浮点数格式,如果不匹配就拒绝加载
(主流平台和语言一般都采用 IEEE 754 浮点数格式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值