嵌入式FORTH虛擬計(jì)算機(jī)的實(shí)現(xiàn)
1.引言
虛擬機(jī)最初是美國(guó)計(jì)算機(jī)科學(xué)家波佩克(Popek)與戈德堡(Gerald)在虛擬化需求中給出了定義,專(zhuān)指有效的、孤立的真實(shí)計(jì)算機(jī)的副本,現(xiàn)在則指可像真實(shí)計(jì)算機(jī)一樣運(yùn)行程序的軟件實(shí)現(xiàn),包括跟任何真實(shí)計(jì)算機(jī)無(wú)關(guān)的虛擬機(jī)。根據(jù)運(yùn)用和與機(jī)器的相關(guān)性可分為系統(tǒng)虛擬機(jī)和程序虛擬機(jī),一個(gè)提供了完整的操作系統(tǒng),另一個(gè)則以運(yùn)行單個(gè)計(jì)算機(jī)程序?yàn)橹鳌?/p>
在嵌入式應(yīng)用領(lǐng)域,嵌入式系統(tǒng)相關(guān)的CPU芯片和微計(jì)算機(jī)硬件系統(tǒng)種類(lèi)繁多,并且不斷推陳出新,甚至多核處理器已被普遍采用。但是在新平臺(tái)上,難以針對(duì)每一種芯片或平臺(tái)制定一種計(jì)算機(jī)語(yǔ)言來(lái)編程。解決的方法一是可采用公共計(jì)算機(jī)語(yǔ)言,用不同的編譯器來(lái)生成機(jī)器碼,但該方法需要具有該語(yǔ)言的編譯器,在新平臺(tái)上往往難以具備。另一種方法即建立一個(gè)虛擬機(jī),然后用一個(gè)計(jì)算機(jī)語(yǔ)言,用一個(gè)解釋器來(lái)解釋執(zhí)行。采用該方法,難點(diǎn)在于嵌入式虛擬機(jī)的構(gòu)建,要能夠適應(yīng)多種環(huán)境、快速構(gòu)建、可擴(kuò)展。
FORTH是一種與眾不同的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言。它具有極強(qiáng)的擴(kuò)展性,通過(guò)字的定義,可實(shí)現(xiàn)不斷堆疊和擴(kuò)展。同時(shí),它又具有極好的交互性,指令可解釋執(zhí)行,這就為應(yīng)用的調(diào)試帶來(lái)了極大的便捷。本文基于FORTH語(yǔ)言,以自主構(gòu)建的JLPFORTH虛擬平臺(tái)為例,詳細(xì)闡述FORTH虛擬機(jī)的實(shí)現(xiàn)原理和核心實(shí)現(xiàn)方法,模擬和實(shí)現(xiàn)了通用的交互式計(jì)算機(jī)結(jié)構(gòu),實(shí)現(xiàn)了真實(shí)計(jì)算機(jī)的典型工作流程[4],并且一改過(guò)去FORTH代碼和數(shù)據(jù)混合存儲(chǔ)的方式,在內(nèi)存的存儲(chǔ)上以分段的方式將內(nèi)存分為CS、VS、DS、SS四個(gè)段,分別存儲(chǔ)指令和數(shù)據(jù),這樣,就實(shí)現(xiàn)了系統(tǒng)指令和用戶(hù)數(shù)據(jù)的分離,有效地提高了代碼和系統(tǒng)的安全性,并且調(diào)試方便、擴(kuò)展性強(qiáng),尤其適合應(yīng)用于對(duì)安全性、兼容性、移植性、擴(kuò)展性、交互性要求高的嵌入式系統(tǒng)領(lǐng)域。
2.FORTH虛擬機(jī)實(shí)現(xiàn)原理
真實(shí)計(jì)算機(jī)的基本工作原理是存儲(chǔ)和控制。計(jì)算機(jī)在控制器的指揮下,取出預(yù)先存儲(chǔ)的指令序列(即程序)和數(shù)據(jù),通過(guò)控制器譯碼,按指令的要求,取出數(shù)據(jù)完成運(yùn)算,再把結(jié)果重新存儲(chǔ)起來(lái),如此循環(huán),直至完成全部指令。對(duì)真實(shí)計(jì)算機(jī)來(lái)說(shuō),這個(gè)過(guò)程依托中央處理器CPU來(lái)實(shí)現(xiàn),CPU包括運(yùn)算器、控制器和寄存器。如果描述CPU核心工作過(guò)程,主要包括以下步驟:
(1)提取程序計(jì)數(shù)器值,該值指向的地址即指令地址;
(2)從該地址取出指令;
(3)程序計(jì)數(shù)器增加指令長(zhǎng)度,即指向下一條指令地址;
(4)解碼執(zhí)行指令;
(5)返回結(jié)果。
由于FORTH虛擬機(jī)是工作在真實(shí)計(jì)算機(jī)上的,因此要實(shí)現(xiàn)FORTH虛擬機(jī)必須用對(duì)應(yīng)關(guān)系依托真實(shí)計(jì)算機(jī)的代碼來(lái)實(shí)現(xiàn)這個(gè)核心過(guò)程。
在FORTH虛擬機(jī)中,用核心算法--NEXT模擬了這個(gè)過(guò)程,將虛擬機(jī)指令和真實(shí)計(jì)算機(jī)指令實(shí)現(xiàn)對(duì)應(yīng),通過(guò)建立字典表,設(shè)置地址跳轉(zhuǎn),以串線碼的方式將虛擬機(jī)命令字和直接機(jī)器指令實(shí)現(xiàn)對(duì)應(yīng),依托真實(shí)計(jì)算機(jī)指令完成了CPU的處理過(guò)程。如圖1所示。
具體過(guò)程是:在FORTH定義字時(shí)創(chuàng)建鏈結(jié)構(gòu)的字典表,在其中存儲(chǔ)各個(gè)字的名稱(chēng)、長(zhǎng)度、狀態(tài)、指令碼以及鏈接指針。例如定義FORTH字S:S DUP *;在字典表存放了各個(gè)FORTH高級(jí)字的名稱(chēng)和代碼執(zhí)行地址,其中也有S字的定義,在S字的代碼場(chǎng)中存有S字的代碼執(zhí)行地址,該代碼執(zhí)行地址與code所描述的直接機(jī)器執(zhí)行代碼相對(duì)應(yīng),構(gòu)成間接串線編碼。當(dāng)執(zhí)行該指令時(shí),首先查找字典表,找到S定義后,取出其WPF指令碼中存放的地址,然后跳轉(zhuǎn)到代碼場(chǎng)該地址中,由于是FORTH高級(jí)字定義,所以首先執(zhí)行“:”機(jī)器碼將程序計(jì)數(shù)器所記錄的下一條指令返回地址壓入棧,然后跳轉(zhuǎn)到參數(shù)場(chǎng)地址依序執(zhí)行,直到最后的“;”返回指令執(zhí)行后,再將原先存入棧的返回地址彈出,這樣即完成一條指令的執(zhí)行。其中,代碼場(chǎng)和參數(shù)場(chǎng)分別存儲(chǔ)指令和參數(shù)。以下以JLP FORTH虛擬機(jī)為例,詳細(xì)描述其字典表、代碼場(chǎng)、參數(shù)場(chǎng)的定義、虛擬機(jī)存儲(chǔ)和指針的分配,以及核心算法。
評(píng)論