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