【发布时间】:2011-06-29 11:45:31
【问题描述】:
我用 C 语言编写了一个虚拟机,它在非 JIT 虚拟机上具有不错的性能,但我想学习一些新东西并提高性能。我当前的实现只是使用一个开关将 VM 字节码转换为指令,然后编译为跳转表。就像我说的那样,性能不错,但我遇到了只能通过 JIT 编译器克服的障碍。
不久前我已经问过一个关于自我修改代码的类似问题,但我意识到我没有问对正确的问题。
所以我的目标是为这个 C 虚拟机编写一个 JIT 编译器,我想在 x86 汇编中完成它。 (我使用 NASM 作为我的汇编程序)我不太确定如何去做。我对汇编很满意,并且查看了一些自修改代码示例,但我还没有弄清楚如何进行代码生成。
到目前为止,我的主要任务是将指令复制到可执行的内存中,带有我的参数。我知道我可以在 NASM 中标记某行,并使用静态参数从该地址复制整行,但这不是很动态,并且不适用于 JIT 编译器。我需要能够解释来自字节码的指令,将其复制到可执行内存,解释第一个参数,将其复制到内存,然后解释第二个参数,并将其复制到内存。
我被告知有几个库可以简化这项任务,例如 GNU 闪电,甚至 LLVM。但是,在使用外部资源之前,我想先手动编写它,以了解它是如何工作的。
这个社区是否可以提供任何资源或示例来帮助我开始这项任务?一个简单的例子展示了两个或三个指令,如“add”和“mov”,用于在内存中动态生成可执行代码,并带有参数,会产生奇迹。
【问题讨论】:
-
仅仅因为抖动会生成机器码,并不不意味着它本身需要用汇编语言编写。这样做毫无意义。
-
尝试的中间步骤是使用 GCC 的计算 goto 扩展进行线程分派(使用
void *optable[] = { &&op_add, &&op_subtract, ... }并且每个操作数是op_add: ... goto *optable[*ip++];)。我已经看到您所描述的转换口译员取得了巨大的进步。
标签: c assembly code-generation jit self-modifying