[英]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上,將VirtualAlloc與PAGE_EXECUTE一起使用。 Linux,AIX等中也存在類似的功能...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.