簡體   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