代码之家  ›  专栏  ›  技术社区  ›  stacker

在运行时,JIT如何替换优化的机器代码?

  •  2
  • stacker  · 技术社区  · 14 年前

    我正在浏览OpenJDK源代码,找不到替换优化代码的地方。

    我想知道如何在保护模式下实现这一点,这不是操作系统应该阻止的某种自我修改代码吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳    14 年前

    “jiter”在堆或堆栈中分配空间,并将汇编代码插入其中。不,自我修改代码是完美的。virtualProtect(Windows)和mmap(Unix)可以将页面映射为可执行文件。默认情况下,通用操作系统会将可执行页面标记为读/执行但不写,您仍然可以在运行时更改此标记。

    如果没有办法修改代码,就没有办法加载一个dll,除非它被加载到一个固定的虚拟地址,并共享到每个进程的地址空间中;然后您将得到地址空间hell而不是dll hell。

    我猜你听说过nx位或dep等,它们只是保护你不执行不可执行的代码,这有助于防止堆栈溢出等。

        2
  •  0
  •   Michael Aaron Safyan    14 年前

    JIT代码不能取代优化的机器代码;它取代了加载的Java字节码。我不知道这是如何在OpenJDK中实现的,但通常,JVM加载字节代码并将其保持在某种内部结构中,通常是在具有用于执行代码的虚拟函数或虚拟函数的类中。当编译时,内部结构的指针被指向具有相同接口的类的指针替换,其中底层表示是本机代码而不是Java字节代码,并且实现虚拟方法,使得它们调用本机代码而不是解释字节代码。代码没有修改,只是指向不同的地方。