我已经为(GNU)C中的基于堆栈的简单VM编写了字节码解释器。所有VM指令均实现为标签之间的代码。大多数指令不使用内联参数,因为它们只是将其从VM堆栈中弹出(例如add
从堆栈中弹出两个数字a
,b
并重新推入a+b
)。
[我以为JIT就像识别字节码中的基本块一样简单,只需通过将标签之间的memcpy
插入使用mmap
/ mprotect
标记为可执行的缓冲区中,就可以将指令实现缝合在一起,从而生成“动态超级指令” 。这适用于除push b
指令以外的所有指令,该指令将字节码流的下一个字节压入VM堆栈(例如push 17
)。
[是否有至少可以移植的方式,我可以实现以类似方式使用参数的指令,方法是将参数“注入”到push
i的memcpy
指令的每个实例中(因此,伪造的闭包位于运行时(?))或至少通过使用[setjmp / longjmp]的某种变体访问正在运行的实例的PC(尽管有人提及PC可能本质上是不可移植的)来让我读取PC值?编辑:通过在伪C(???)中执行以下操作,PC可能会很有用
char arg;
char args[] = {1, 2, 3};
push:
uintptr_t pc = get_pc();
arg = args[some_clever_hash(pc)];
stack.push(arg);
也许这样会更现实吗?:
char arg;
char args[] = {1, 2, 3};
push:
setarg();
stack.push(arg);
void setarg(void)
{
uintptr_t pc = get_pc_of_caller();
arg = args[some_clever_hash(pc)];
}
我已经为(GNU)C中的基于堆栈的简单VM编写了字节码解释器。所有VM指令均实现为标签之间的代码。大多数指令不使用内联参数,因为它们只是...
bytecode