摘 要:虛擬機是指通過軟件方式模擬出具有完整計算機硬件系統功能的并運行在一個相對完全隔離環境中的完整計算機系統。虛擬機就像一臺真正的計算機,它一樣擁有自己的CPU、寄存器組、指令系統、輸入輸出以及堆棧等等。它和真實的計算機一樣接受指令,執行指令并最終完成所規定的處理任務。虛擬機最重要的優點就是實現程序的跨平臺性,即可以在不同的操作系統之間重復使用,這也是虛擬機被廣泛應用的重要原因。本文對虛擬機CPU平臺的基本執行環境進行了較深入的分析與研究,分別闡述了CPU平臺的基本執行環境,虛擬機的數據棧、計算棧、參照棧的運行機制。
關鍵詞 虛擬機 執行環境 運行機制
中圖分類號: TP312.2文獻標識碼:A 文章編號:1674-098X(2015)04(a)-0000-00
虛擬機技術在現代社會有著廣泛的應用范圍,基于虛擬機平臺的軟件具有很多優點,比如可移植性、高效性、簡潔性和安全性等等。可移植性既是通過采用中間語言,使得一個程序能夠在多個硬件平臺或多個不同操作系統上能正常、準確的執行。高效性既是盡可以以犧牲本機代碼的編譯速度來調動執行引擎能夠更加優化的使用底層機器的特性來提高程序的執行速度,確保軟件開發具有更高的執行效率。簡潔性既是指所采用的中間代碼通常比二進制代碼具有更好的可讀性和壓縮性。這個特性能更好的支持動態下載代碼并且非常適合一些內存緊缺的應用環境。安全性既是相對于二進制指令來說,中間代碼具有更強的類型約束和語義配置操作,中間代碼比二進制文件更能得到運行時系統的強制執行。深入研究虛擬機基本執行環境對于研發人員意義重大。
1運行時系統與虛擬機
計算機本身就是一個運行時系統,運行時系統是很多計算機程序賴以執行的一個環境。運行時系統提供了程序在執行時所需要的所有條件。比如運行時系統為程序分配內存、加載應用程序、執行程序中的指令、處理服務請求等等。
運行時系統的種類可以按不同的分類方式分為很多種。按執行程序指令的基本方式可以把運行時系統分為兩大類。一類是以處理器本身的機器碼為指令編寫程序,另一類是用機器指令編寫程序。以處理器本身的機器碼為指令編寫程序是指由計算機的操作系統和處理器構成運行時系統,操作系統負責總體籌劃,而處理器用來執行程序的指令。也就是說操作系統定義了一套完整的規范,而由CPU來執行這套規范。虛擬機實際上是一整套規則,而不是單一用軟件就能夠簡單實現的,虛擬機的實現完全是按照一套嚴謹的規范來定義的。虛擬機可以由任意一種程序設計語言來實現,它可以實現在任意一種硬件平臺上,但前提必須是遵守它的規范。只要是遵守同一套規范的運行時系統,你就可以不需要對它進行編譯而直接能在其上運行各種指令代碼,這和它是一套軟件模擬系統還是一臺真正的計算機沒有關系。
2虛擬機的棧實現
2.1虛擬機數據棧的運行機制
堆棧有很多優點,例如高效率的函數調用,清晰的遞歸調用,較小的上下文切換等。可以將虛擬機地址空間最頂部的那個內存段空間設置為堆棧段,用來支持以后所有的操作,所以建立一個堆棧是可行的。
AVM虛擬機啟動運行,進行系統初始化的設置,首先為堆棧類型的數據動態申請幾段內存空間,這段空間是虛擬機最核心的數據結構,它是由代碼區、數據棧、計算棧、函數運行棧等組成的一個系統。在虛擬機中用來描述棧頂的一個元素是由計算棧和參照棧結合起來完成的,計算棧和參照棧主要實現計算功能,而數據棧則負責函數的局部變量和函數調用的運行環境。數據棧(data--Stk)是用來實現過程調用的上下文記錄和切換,它的功能類似于活動記錄,數據棧對任何一個過程的調用都一樣,都是分配該數據棧的一個區域給該過程。每當有函數調用時,首先是壓入一幀,其次當函數調用結束后,該幀出棧,最后恢復虛擬機的程序計數器。數據棧如果按區域劃分可分為父過程運行環境保存區、本過程局部變量區以及傳入實參區三個區域。
AVM虛擬機在運行時,會啟動一個虛擬機實例,首先向宿主操作系統申請分配內存,然后用分配到的內存組成一個人工地址空間,這個空間用來提供給單個應用程序來使用。這段地址空間在內存中可被劃分成堆棧段和代碼段兩個部分。首先,在虛擬機的初始化過程中,為數據段和進程代碼段建立映射,然后將數據段和代碼段的內容讀入內存,這一工作是由虛擬機系統的過程加載處理函數負責的。此外,凡是未被賦初值的局部變量初始值都為零,這是因為虛擬機的初始化會將數據堆棧段清零。代碼段分為只讀數據和運行代碼兩個部分,在內存中,代碼段的類型是只讀的,所以代碼段絕對不會被改寫,任何企圖修改代碼段的指令都將會引發嚴重的錯誤。程序在執行過程中除了有數據段和代碼段的支持外,還要有動態環境的支持,堆棧就是其中重要的一個動態環境。
在計算機領域中,數據堆棧是一種非常重要而且會被經常用到的抽象數據類型。堆棧有兩個非常重要的操作,即是Push操作和Pop操作,也就是壓入和彈出操作。數據堆棧的特點是最后進入數據堆棧的對象最先被彈出,即它是 LIFO(Lastin,firstout)后進先出。從操作層面上來講,數據堆棧是一個后進先出的隊列,它的方向與內存的方向正好相反。從物理層面上來講,數據堆棧其實就是一段連續分配的內存地址空間。它是由一系列堆棧幀組成的。棧幀的定義是將一個過程調用在堆棧中存放的父過程運行環境保存區、本過程的局部變量區以及傳入實參數區域總稱為一個棧幀 (StackFralne)。當調用過程時邏輯堆棧幀被壓入棧中,當過程返回時邏輯堆棧幀被從棧中彈出。在虛擬機執行過程中,有時虛擬機會根據中間字節碼的一些指令把這些數據存入堆棧,有時也會用寄存器來傳遞一些指令。
2.2虛擬機計算棧和參照棧的運行機制
計算棧的作用是主要用來進行各種算數運算和邏輯運算,還有保存計算式中的子函數的返回值以及運算數、運算符等,計算棧經常在自動轉換字符類型時使用。計算棧也是一組普通的字節數組,它在進行PUSH壓入和POP彈出操作的時候必須要依靠參照棧來執行。
參照棧主要用來描述像每次出棧入棧的長度還有出入棧的數據類型等在計算棧中存放的信息的屬性。
在計算棧中進行push或pop操作和其相互關聯的棧中元素是保持參照關系的。
虛擬機可以完成很多功能,例如模擬不同類型的操作系統,模擬網卡、硬盤等硬件設備,進行一些病毒試驗,模擬組建大型網絡和各種計算機軟件相關試驗等。一些通用型的大型機需要占用大量的資源,如對軟件授權的要求,對存儲器的要求,對中央處理器的要求等等,在資源相對緊張的嵌入式領域中并不能得到廣泛的認同。只有掌握了虛擬機技術,才可以為大型應用軟件的開發提供了一個功能更加強大、擴展性更加良好的應用平臺。
參考文獻
[1] Bill Blunden著. 楊濤等譯. 虛擬機的設計與實現——C/C++. 機械工業出版社.2003年1月
[2]孫希、俞建新:Java虛擬機新技術探討南京大學計算機軟件新技術國家重點實驗室,《計算機應用》第21卷第8期
[3] 朱成光.棧式虛擬機的開發運行平臺的設計與實現.碩士學位論文,2007年3月.
[4] 趙旭澤.虛擬機平臺的設計與關鍵模塊的實現.碩士學位論文,2011年3月.
[5] 林巧民.虛擬機相關技術研究及實現.碩士學位論文,2004年5月.
作者簡介:李靜(1977---),女 ,漢族 ,遼寧職業學院 講師、網絡工程師。