我正在浏览OpenJDK源代码,无法找到替换优化代码的位置。
我想知道如何在保护模式下完成这项工作,是不是应该由操作系统阻止的某种自修改代码?
答案 0 :(得分:2)
“JITer”在堆或堆栈中分配空间并将汇编代码插入其中。不,自修改代码完全没问题。 VirtualProtect(Windows)和mmap(Unix)可以将页面映射为可执行文件。默认情况下,通用操作系统会将可执行页面标记为读取/执行但不写入,您通常仍可以在运行时更改此值。
如果无法修改代码,除非将其加载到固定的Virutal地址并共享到每个进程的地址空间,否则无法加载dll;然后你会得到地址空间地狱而不是地狱。
我猜你听说过NX位或DEP等,这些只是保护你不会执行非可执行代码,这有助于防止堆栈溢出等。
答案 1 :(得分:0)
JIT代码不会取代优化的机器代码;它取代了加载的Java字节码。我不知道这是如何在OpenJDK中实现的,但通常,JVM加载字节代码并将其保留在某种形式的内部结构中,通常在具有虚函数的类或用于执行代码的虚函数中。当它被及时编译时,指向该内部结构的指针被指向具有相同接口的类的指针替换,其中底层表示是本机机器代码而不是Java字节代码,并且虚拟方法被实现为他们调用本机代码而不是解释字节代码。没有修改代码,只是指向不同的地方。