luajit开发文档wiki中文版(五) 系统集成

2022年6月10日15:15:35

 

luajit开发文档中文版(一)下载和安装

luajit开发文档中文版(二)LuaJIT扩展

luajit开发文档中文版(三)FAQ 常见问题

 

luajit开发文档wiki中文版(一) 总目录

luajit开发文档wiki中文版(二) LuaJIT 扩展

luajit开发文档wiki中文版(三)性能调优和测试

luajit开发文档wiki中文版(四) LuaJIT 内部结构

luajit开发文档wiki中文版(五) 系统集成

luajit开发文档wiki中文版(六) LuaJIT 开发

Linux binfmt_misc

由于 Linux 内核的特殊功能,可以将自定义二进制格式注册为可执行文件。如果通过 binfmt_misc 接口注册了特定的二进制格式并且包含的​​文件具有可执行属性集,内核将使用指定的解释器/仿真器执行该文件。

要了解有关此功能的更多信息,您可以访问以下页面:

对此的支持必须编译到内核中,并且可以通过以下方式进行验证:

# check whether there is support for this feature
zcat /proc/config.gz | grep -i binfmt_misc

# should output:
CONFIG_BINFMT_MISC=y

如果启用,则该接口在根目录树中暴露的位置是分发和初始化系统特定的。您可以使用findmnt工具来定位有问题的挂载点:

# locate the binfmt_misc control interface
findmnt binfmt_misc

# sample output:
TARGET                   SOURCE      FSTYPE      OPTIONS
/proc/sys/fs/binfmt_misc binfmt_misc binfmt_misc rw,relatime

根据http://repo.or.cz/w/luajit-2.0.git/blob/HEAD:/src/lj_bcdump.h LuaJIT 字节码魔术字节是 0x1b、0x4cx、0x4a 和第四个字节指定 LuaJIT 版本。标头从偏移量 0 开始,默认 LuaJIT 运行时应自行处理版本检查。

/* Bytecode dump header. */
#define BCDUMP_HEAD1            0x1b
#define BCDUMP_HEAD2            0x4c
#define BCDUMP_HEAD3            0x4a

在我们的示例中,我们可以通过以下方式将 LuaJIT 字节码注册为可执行格式:

# as root, we write following string to control file
# don't forget paths may be different on your distribution!
echo ":luajit:M::\x1b\x4c\x4a::/usr/bin/luajit:" > /proc/sys/fs/binfmt_misc/register

#we can verify that registration was sucessful with ls command:
ls -al /proc/sys/fs/binfmt_misc

# sample output:
luajit	register  status

通过此设置,我们现在可以直接将字节码作为普通二进制文件运行:

#  Create some bytecode
luajit -be "print('hello world through binfmt_misc interface')" binfmt_test
# mark file as executable
chmod +x binfmt_test     
# testing run:
./binfmt_test

# final output:
hello world through binfmt_misc interface

正如我们所看到的,这个特定的 Linux 特性允许它将 LuaJIT 编译的字节码视为第一类可执行格式。可能的应用程序的数量是无穷无尽的。

例如,由于字节码可以比纯 lua 代码更快地加载,因此可以将经常或早期调用的脚本预编译为字节码,甚至存储在初始系统 ramdisk 上,以及 luajit 和其他所需的依赖项。这使我们能够在不需要 shell 的情况下实现最大的调用效率和速度,这在诸如 live CD 和可引导 USB 密钥甚至嵌入式系统等受限环境中可能很重要。

还可以创建实用程序和脚本,在不放弃快速开发周转和 lua 灵活性的好处的情况下,这些实用程序和脚本看起来与已编译的应用程序与普通用户没有区别。

 

使用 luajit 的地方

 

嵌入 LuaJIT

  • GSL Shell:绑定到 GNU Scientific Library (GSL) 的库和 Lua shell 接口,包括矩阵、向量和各种数学例程

  • Redis fork:Redis 是一个持久存在于磁盘上的内存数据库。数据模型是键值,但支持许多不同类型的值:字符串、列表、集合、排序集、哈希。Redis 嵌入 Lua;这个分支从 PUC-Lua 切换到 LuaJIT。

  • Tarantool:Tarantool 是一个复制的、持久的内存数据库和一个 LuaJIT 应用服务器。

  • Csound : Csound 是一个用户可编程的、开源的、跨平台的软件声音合成系统和音乐创作系统。Csound 是它自己的语言,但嵌入了 LuaJIT 以提供更高级的编程范式,主要用于算法组合,也用于声音合成。

  • Knot-resolver:一个验证 DNS 解析器,它使用 Lua(JIT) 作为其配置+CLI 语言,并且可以通过 lua 模块进行扩展。

支持 LuaJIT

  • ZeroBrane Studio:ZeroBrane Studio 是一个轻量级的 Lua IDE,具有代码完成、语法高亮、远程调试器、代码分析器、实时编码和对多个 Lua 引擎的调试支持。支持 LuaJIT 下的调试脚本。

  • ULua:基于 LuaJIT 的二进制、可移植的 Lua 发行版,适用于 Windows、OSX 和 Linux。包括一个包管理器和 LuaRocks 集成。

  • Luapower:Luapower 是一个免费和开源的 LuaJIT 模块分发,是一个用于部署和共享 Lua 模块的系统。Luapower 的目标是将 LuaJIT 变成一个功能强大的跨平台开发环境,一砖一瓦。您可以想象在其上构建下一个 Illustrator 或下一个 Firefox 的平台。

使用 LuaJIT 实现

    • Snabb Switch:Snabb Switch 是一款开源虚拟化以太网交换机,用于软件定义的云网络。Snabb Switch 是运行在 Hypervisor 主机上并在虚拟机和物理机之间传输以太网数据包的程序。

    • BCZ.com使用 luajit 进行聊天应用程序开发和搜索接口。

    • YEng是一个开源游戏引擎

    • Goluwa用 luajit 编写的实验性游戏引擎

    • KOReader是适用于 Kindle、Kobo 和 Android 设备的开放式电子书阅读器程序,支持 PDF、DJVU、EPUB、FB2、HTML、CHM 和其他文件格式。它具有多种功能,例如由 libk2pdfopt 支持的嵌入式文档重排、文件同步以及与 Calibre 集成以进行图书收藏管理。该应用程序本身在 Lua 中实现并在 LuaJIT 上运行,但集成了多个 C 和 C++ 库,其中大部分已经移植到 FFI

 

架构支持

 

一般信息


数字模式

LuaJIT 已经有一个双数模式(混合整数/双精度数),主要使用整数计算。在 ARM 上,您也可以获得软浮点支持。

以下是支持的配置:

archnumber modesFPUABI
x86 single|(dual) x87|SSE2 hardfp
x64 single|(dual) SSE2 hardfp
ARM dual soft|VFP softfp|hardfp
PPC dual|single FPU-dbl hardfp
e500 single SPE softfp
MIPS single FPU-dbl hardfp

posted on 2022-06-13 11:13  zh7314  阅读(420)  评论(0编辑  收藏  举报