繁体   English   中英

JVM如何通过JIT运行Java应用程序中生成的机器代码?

[英]How is it possible for JVM to run generated machine code from a Java application via JIT?

JVM如何动态地将字节码编译为本机代码然后执行呢? 我可以想象有可能将数据值写入内存,但是如果我没记错的话,程序将无法写入包含指令的内存(否则病毒可能会使用此功能并迅速扩散)。

很少有架构实现您所谈论的内存保护级别(只有操作系统具有对包含代码的内存区域的写访问权),而Java使用JIT的架构绝对不会。

病毒确实使用此功能,甚至更多功能可以快速扩散。 但是,当您考虑它时,在修改自己的代码的过程中并没有固有的危险。 它比能够写入文件然后加载库没有更多危险。

通常,您不能直接写入包含代码的内存部分,但是有一些方法可以覆盖它。 对于JIT,通常要做的是在堆上具有一些读写数据空间,然后使用诸如mprotect的操作使其可执行。

操作系统确实提供了分配“可执行”内存的功能。 生成JIT代码时,JVM需要以与标准malloc()不同的方式分配目标内存。

例如,在Windows上,将VirtualAllocPAGE_EXECUTE一起使用。 Linux,AIX等中也存在类似的功能...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM