【问题标题】:Native code execution by JVM/CLRJVM/CLR 执行本机代码
【发布时间】:2009-07-04 16:58:43
【问题描述】:

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

【问题讨论】:

    标签: clr jvm jit


    【解决方案1】:

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

    【讨论】:

    • 考虑到 DEP 以及数据和可执行代码的明确分离,以及无法写入可执行内存和无法跳转/执行数据内存,我仍然对它在 Win32 上的完成方式非常感兴趣带有 CLR/JIT 的系统。
    • @Abel 你可能会发现this 的文章很有趣。
    【解决方案2】:

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

    如果你想确定,没有比来源更好的答案了:http://download.java.net/jdk6/source/

    【讨论】:

      【解决方案3】:

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

      MSDN 在 MethodDesc 部分有更深入的explanation

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多