【发布时间】:2011-02-19 17:25:46
【问题描述】:
我正在浏览 OpenJDK 源代码,但找不到替换优化代码的地方。
我想知道如何在保护模式下做到这一点,这不是操作系统应该阻止的某种自我修改代码吗?
【问题讨论】:
标签: java optimization assembly jit
我正在浏览 OpenJDK 源代码,但找不到替换优化代码的地方。
我想知道如何在保护模式下做到这一点,这不是操作系统应该阻止的某种自我修改代码吗?
【问题讨论】:
标签: java optimization assembly jit
“JITer”在堆或堆栈中分配空间并将汇编代码插入其中。不,自我修改代码非常好。 VirtualProtect (Windows) 和 mmap (Unix) 可以将页面映射为可执行文件。默认情况下,通用操作系统会将可执行页面标记为读/执行但不写,您通常仍然可以在运行时更改此设置。
如果无法修改代码,就无法加载 dll,除非将其加载到固定的虚拟地址并共享到每个进程的地址空间中;那么你会得到地址空间地狱而不是 dll 地狱。
我猜你听说过 NX 位或 DEP 等,它们只是保护你免于执行不可执行的代码,这有助于防止堆栈溢出等。
【讨论】:
JIT 代码不会替代优化的机器代码;它替换了加载的 Java 字节码。我不知道这是如何在 OpenJDK 中实现的,但通常情况下,JVM 会加载字节码并将其保存在某种形式的内部结构中,通常在具有用于执行代码的一个或多个虚拟函数的类中。当它被即时编译时,指向该内部结构的指针被指向具有相同接口的类的指针替换,其中底层表示是本机机器代码而不是Java字节码,并且虚拟方法是这样实现的他们调用本机代码而不是解释字节码。没有修改代码,只是指向不同的地方。
【讨论】: