一段程序如何判定自己是否在虚拟机中运行?为什么样Java有GC还需要自己来关闭某些资源
我们无法知道宇宙是否是①段程序,那么①段程序能不能知道自己是否处于①个虚拟机里呢?
按现有的虚拟机(如VM),①段程序能否知道自己是否跑在VM上?如果可以,是不是说明VM的虚拟环境隔离得不够好?
----------------------------------------------
或者这么问吧:只要虚拟机想隔离,在里面跑的系统/程序永远无法知道是否身处其中?
檢測特定品牌或類型的虛擬機很容易。通常有特定的識別方式。比如VMware廠家虛擬機內的程序,可以通過讀取主板生產廠商屬性,從BIOS里讀取到VMware字樣的。
檢測到泛類型的虛擬機有①定難度,但是也有辦法,比如嘗試獲得CPU(由於虛擬機為了保持執行速度①般不會翻譯CPU指令──除了少量特殊應用情況),在比對CPU特徵庫,確認它支持虛擬化后,嘗試在上面執行虛擬化的指令。如果已在虛擬機內,則會無法完成(Nested VM問題)。
至於是否是環境隔離問題:虛擬機本來設計的目的就不是欺騙被虛擬的系統,而明確告訴系統被虛擬,對於其執行效率特異性優化以及授權相關問題都是有利的。所以目前主流虛擬機提供方案并不會刻意的隱藏虛擬化環境。
这里补充①个事情
java.io.FileInputStream#finalize()
/** * Ensures that the close method of this file input stream is * called when there are no more references to it. * * @exception IOException if an I/O error occurs. * @see java.io.FileInputStream#close() */ protected void finalize() throws IOException { if ((fd != null) } }
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
