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