JVM / CLR执行本机代码

时间:2009-07-04 16:58:44

标签: clr jvm jit

JVM / CLR如何执行JIT编译的本机代码?是通过一些代码注入还是通过将代码复制到可执行内存?什么是允许动态代码执行的系统调用?

3 个答案:

答案 0 :(得分:3)

我可以在CACAO VM(一个仅研究JIT的JVM)中解释我们是如何做到的。首先,将方法的机器代码生成到一些堆分配的内存块中。编译之后,最终的代码长度是已知的,并且使用mmapPROT_EXEC标志(相关的CACAO代码here)分配一块可执行内存。然后,将机器代码复制到mmapped区域。之后,许多架构需要一些特定于机器的缓存刷新机制。举个例子,看一下PowerPC 64的cache-flushing function。值得注意的是,在i386和x86_64上,没有什么可做的。在此步骤之后,处理器准备好执行新生成的代码。或者,已分配的内存页面可以使用mprotect标记为可执行文件。请注意,mmap / mprotect是Unix工具。

答案 1 :(得分:2)

我不知道Java是如何做到的,但通常你会在解释器的指令流中插入“trap”操作码。有两个操作码in the JVM spec似乎是为此目的而量身定做的。

如果您想确切知道,没有比来源更好的答案:http://download.java.net/jdk6/source/

答案 2 :(得分:2)

公共语言运行时具有每种类型的方法表,其中条目指向本机代码或本机存根到JIT托管代码,然后使用指向刚创建的本机代码的指针修复方法表。

MSDN在MethodDesc部分

中有更深入的explanation

This blog entry by Dave Notario解释了CLR JIT编译器的工作原理。