COMET虛擬機設計分析論文

時間:2022-10-11 11:08:00

導語:COMET虛擬機設計分析論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

COMET虛擬機設計分析論文

摘要comet虛擬機是一種為了教學目的而定義的虛擬機,其結構雖然簡單,但功能完備,可作為一種教學輔助工具,幫助大學本科學習計算機課程的學生更好地理解現在計算機的結構和工作原理。作者基于原有COMET虛擬機定義,改進并實現了一個功能相對完備的虛擬機。COMET虛擬機的開發主要突出兩個原則:簡單性和可移植性。本文將對COMET虛擬機的開發細節做一個完整的描述。

關鍵詞COMET虛擬機;設計;實現

1引言

虛擬機就是一臺假想的機器。一臺虛擬機與一臺真實存在的計算機不同之處在于前者只是一個技術規范。虛擬機技術從很早就開始研究,并且在軟件技術中廣為應用。目前,高度可移植的JAVA編程語言采用的就是虛擬機技術。虛擬機不僅有廣泛的商業應用價值,同時也可作為一種很好的教學輔助工具。通過虛擬機,學生可以很好地學習理解計算機的結構和工作原理。因此,設計并實現一個簡單的虛擬機有很好的教學意義[4,5]。

COMET虛擬機開始只是作為CASL匯編語言的運行平臺而設計,并由中國計算機軟件專業技術資格和水平考試大綱中給出的CASL匯編語言文本定義(下文將簡稱為文本)。作者在文本的基礎上,對COMET虛擬機的功能進行了一定的改進和擴充,并實現了一個功能完善的虛擬機實例[1]。

2COMET虛擬機設計

2.1邏輯結構

圖1COMET虛擬機結構

COMET虛擬機是一臺基于寄存器模型結構的計算機。COMET虛擬機系統主要包括三個部分:中央處理器(CPU)、存儲器和出入輸出設備。COMET計算機的邏輯結構如圖1所示。

CPU是由寄存器、算術邏輯部件和控制邏輯組成。寄存器在程序運行時存儲計算過程的各種信息;算術邏輯部件的功能是進行所有的算術和邏輯運算。由于COMET計算機是虛擬的計算機,因此,它的控制邏輯對于我們是透明的[1,4,5]。

2.2寄存器

COMET虛擬機有5個通用寄存器GR(16位),一個指令計數器PC(16位)和一個標志寄存器FR(2位)。

GR(通用寄存器)5個通用寄存器的編號為0、1、2、3、4,分別記為GR0、GR1、GR2、GR3、GR4。這些通用寄存器用于算術、邏輯、移位等運算,其中GR1、GR2、GR3、GR4通用寄存器兼做變址寄存器。另外,GR4還兼做棧指針(SP)用,棧指針是存放棧頂地址用的寄存器。

PC(指令計數器)在執行指令的過程中,PC中存放著正在執行的指令的第一個字的地址。當指令執行結束時,一般是把PC的內容加上當前指令的長度(不同指令的長度不同),只有在執行轉移指令且條件成立時,才將轉移指令地址置入PC中。

FR(標志寄存器)在ADD、SUB、MUL、DIV、MOD、AND、OR、EOR、CPA、CPL、SLA、SRA、SLL、SRL、LEA等指令執行結束時,根據執行的結果,將FR設置成00、01或10(大于、等于、小于或負數、零、正數)。它們不會因其他指令的執行而改變。

2.3存儲器

COMET虛擬機是一臺16位的定點計算機,主存儲器的基本存儲單位是字,總容量為65536(216=16k)字,各個字的地址按照0000-FFFF(十六進制)編號。一個字的16位二進制采用從左到右次序編號,如圖2所示。

圖2字節順序

COMET虛擬機可以處理三種數據,即字符數據、帶符號整數、地址數據。字符數據采用16位的Unicode字符;帶符號整數采用二進制補碼表示,可表示的數值范圍為[-215,215-1];地址數據為無符號的整數,范圍是[0,216-1]。

在實現的COMET虛擬機中,內存的高1k字保留用于各種專用的外設寄存器[1,3]。

2.4指令系統

COMET虛擬機和文本相比,新增加了HALT、MUL、SUB、MOD四條指令。下面只給出HALT、MUL、SUB、MOD四條指令的說明,其他的指令可以參考文本。

HALT指令執行停機操作,占一個字長。MUL指令執行乘法操作,操作規則和ADD等指令相似,占2個字長。SUB指令執行除法操作,操作規則和ADD指令相似,占2個字長。MOD指令執行取模操作,操作規則和ADD指令相似,占2個字長。

2.5指令格式

COMET虛擬機機器指令一般包含三種信息:OP,GR,XR,ADR。其中OP為機器指令的編號,對應第一個字的[0-7]位;GR為通用寄存器編號,對應第一個字中的[8-11]位;XR為變址寄存器編號,對應第一個字的[12-15]位,[12-15]位為0表示沒有變址(GR0不能作為變址寄存器);ADR為操作數,對應地二個字的[0-15]位。如果一個指令不含某種信息(例如,沒有ADR),則忽律該字段。OP、GR、XR、ADR的存儲細節如圖3所示。

圖3指令格式

根據指令操作數據的類型的不同,可將COMET虛擬機的機器指令分為四種:寄存器-存儲器型,存儲器型,寄存器型,空操作數型。如果一個COMET虛擬機指令不涉及主存儲器操作(無ADR),則為1個字長,其他均為2個字長。

2.6字節碼格式

字節碼文件是COMET虛擬機的可執行文件。在啟動虛擬機時,由命令行中的參數給出字節碼文件名。字節碼文件含有程序的長度、裝載位置、程序指令等信息。虛擬機依據這些信息,將字節碼中的指令從二級存儲器裝載到相應的虛擬機內存。這一系列操作和操作系統的程序加載器的工作情況類似[4]。

COMET虛擬機的字節碼文件是一種二進制格式文件,格式如圖4所示。

圖4字節碼結構

其中addr為字節碼在虛擬機內存的裝載地址,len為字節碼中指令的個數(不包含len和addr),ins1、ins2、…、insn為要載入虛擬機的指令。

2.7輸入輸出設備

文本中并沒有明確定義COMET虛擬機的輸入輸出設備,只是給出IN、OUT幾個IO操作宏指令。在這里,我們采用將外部設備寄存器在內存中統一編址的方法來處理輸入和輸出設備[1,3]。

COMET虛擬機默認的I/O設備是鍵盤和顯示器。利用操作系統提供的從定向功能用戶也可以將它們重新定向到其他的設備。

COMET虛擬機輸入輸出設備的兩個專用寄存器為:IO_ADDR、IO_FLAG,分別對應0xFD100、xFD10地址內存。IO_ADDR用于保存要傳輸數據的內存地址;IO_FLAG為IO設備的標志位,其8-15位是要傳輸數據的個數(0表示無IO),7位表示輸入或輸出(1表示輸入,0為輸出),6位在出現IO錯誤時設置,3-5位為傳輸的類型(有字符、八進制、十進制、十六進制等),0-2位保留。

2.8調試器

COMET調試器是一個內嵌在虛擬機里的機器級的調試器。當需要調試一個COMET虛擬機的程序時,只需要在啟動COMET虛擬機的時給出相應的命令參數就啟動調試功能了[2,4]。

COMET調試器的基本功能有:顯示幫助(help),運行程序直到停止(go),分步執行(stepn),跳轉程序(jump),顯示寄存器內容(regs),顯示內存數據(dMem),顯示內存指令(iMem),修改內存數據(alter),遍歷指令(trace),指令記數功能(print),重新裝載字節碼(clear),退出調試器(quit)。每個調試命令的具體用法可以參考COMET虛擬機的幫助文件。

3COMET虛擬機實現

3.1虛擬機數據結構

structcomet

{

off_tpc;

shortfr;

shortgr[5];

shortmem[MEMSIZE];

}cmt;

虛擬機結構變量cmt是一個全局變量,成員分別為:指令計數器(pc)、標志寄存器(fr)、通用寄存器(gr)、存儲器(mem)。將cmt設計為全局變量的優點是個函數不用傳遞復雜的結構體參數,缺點是每個進程同時只能有一個虛擬機實例。

3.2主函數

int

main(intargc,char*argv[])

{

init(argc,argv);

if(debug)comet_debug();

elsewhile(comet_step());

fclose(source);

return0;

}

函數init首先初始化COMET虛擬機并裝載字節碼,如果發生錯誤則停止。然后根據調試器狀態,選擇運行虛擬機的方式。如果調試開關(debug)被設置,則調用comet_debug函數在調試狀態下運行COMET虛擬機。如果沒有打開調試開關,則循環調用單步執行函數comet_step,直到程序結束[1,2]。

3.3字節碼載入

void

comet_load(void)

{

unsignedshortn,flag[2];

fseek(source,0,SEEK_SET);

n=fread(flag,

sizeof(off_t),2,source);

n=fread(&cmt.mem[flag[0]],

sizeof(off_t),tmp[1],source);

/*其他處理代碼*/

}

變量n用于記錄讀取字節碼的數目,如果n小于相應的值,則發生字節碼裝載錯誤。變量flag用于保存字節碼裝載信息,分別字節碼裝載地址和字節碼大小。

COMET字節碼設計比較簡單,也存在很多不足。例如,沒有標志文件格式的魔數,沒有更完善的錯誤檢測措施。我們的目的是讓讀者了解字節碼的工作原理,因此只給出了一種最簡單的實現[1,2,4]。

3.4指令解析

指令的解析一般包含這個幾個過程:取指令,解碼,執行。其中解碼對虛擬機的執行效率有很大的影響[5]。這里采用下標索引技術來解碼指令。具體代碼如下:

voidcomet_ld(void);/*LD指令*/

voidcomet_ld(void);/*ST指令*/

voidcomet_ld(void);/*LEA指令*/

/*其他指令函數聲明*/

intcomet_step(void)

{

staticvoid(*comet_op)()={

comet_ld,comet_st,comet_lea,

/*其他指令執行函數指針*/

};

/*解析指令,存放在op中*/

shortop=get_op();

/*執行op對應的代碼*/

(*comet_op[op])();

/*返回執行狀態*/

returnval;

}

例如,有指令LEA,其對應的機器碼為031,那么將通過函數指針數組comet_op直接定位到(*comet_op[031])函數,即并執行相應的comet_lea函數。

3.5輸入輸出設備

COMET虛擬機在解析每個指令前,先讀取IO設備狀態寄存器IO_FLAG中的值,如果IO_FLAG被設置,則執行相應的IO操作[3]。具體代碼如下:

void

comet_io(void)

{

switch(cmt.mem[IO_FLAG]&IO_TYPE)

{

caseIO_NULL:

/*無IO操作*/

caseIO_OCT&IO_IN:

/*八進制輸入*/

caseIO_DEC&IO_IN:

/*十進制輸入*/

caseIO_HEX&IO_IN:

/*十六進制輸入*/

caseIO_OCT&IO_OUT:

/*八進制輸出*/

caseIO_DEC&IO_OUT:

/*十進制輸出*/

caseIO_HEX&IO_OUT:

/*十六進制輸出*/

default:

/*未知IO類型*/

}

/*重置IO狀態寄存器IO_FLAG*/

}

3.6調試器

調試程序是建立和單步執行的COMET虛擬機之上的。當沒有打開調試功能時,循環執行COMET虛擬機字節碼程序,直到停止。當打開了調試功能時,調試函數debug根據調試命令,執行相應步的指令、顯示或操作相關的數據。

/*各種調試命令*/

typedefenum

{

GO,STEP,JUMP,REGS,

IMEM,DMEM,ALTER,

TRACE,PRINT,CLEAR,

HELP,QUIT

}DbType;

/*調試函數*/

void

comet_debug(void)

{

intcmd;/*保存調試命令*/

while(1){

/*讀調試命令*/

switch(cmd){

caseHELP:/*幫助文件*/

caseGO:/*執行程序*/

caseSTEP:/*分步執行*/

/*其他調試命令*/

default:/*未知命令*/

}

}

}

調試函數comet_debug根據不同的調試命令執行相應的操作,并顯示虛擬機狀當前的狀態信息。

4運行虛擬機

下面通過一個求(1+2+…+n)的程序,來介紹其在COMET虛擬機上的執行的流程。程序的字節碼由相關的工具生成,保存為et文件(后綴為comet)。

4.1普通運行

輸入命令:cometsum

在COMET虛擬機獲得sum參數后,會自動識別為et字節碼文件。

輸入100,表示求1+2+…+100的和。

COMET虛擬機輸出:

===============

COMET虛擬計算機

===============

100

5050[root@knuth/root]#

表示1+2+…+100等于5050,結果正確。

4.2調試運行

輸入命令:comet–dsum

===============

COMET虛擬計算機

===============

調試(幫助輸入help)...

輸入命令:t

指令顯示功能打開

輸入命令:p

指令計數功能打開

輸入命令:r

顯示寄存器數據

GR[0]=0PC=0

GR[1]=0SP=fc00

GR[2]=0FR=01

GR[3]=0

輸入命令:d

顯示內存數據

mem[0]=1200

輸入命令:i

顯示內存指令

mem[0]:JMP5

輸入命令:g

mem[0]:JMP5

mem[5]:STGR0,fe00

mem[7]:PUSHfe00

mem[9]:LEAGR0,4

mem[b]:STGR0,fd10

mem[d]:LEAGR0,c01

mem[f]:STGR0,fd11

mem[11]:POPGR0

3

mem[12]:LDGR0,4

mem[14]:STGR0,2

……

6mem[4f]:JMP51

mem[51]:HALT

執行指令數目=71

輸入命令:q

退出調試...

其中t、p、d、r、g分別是調試命令trace、print、dMem、regs、go的縮寫;3(mem[11]的下一行)是用戶輸入的數據,不是調試命令。6(mem[4f]行)表示1+2+3的和為6。

COMET虛擬機內嵌的調試器功能非常強大,熟練掌握后對COMET虛擬機的程序開發會有很大的幫助。調試命令細節可以通過幫助命令help獲得。

5結語

本文給出了COMET虛擬機的硬件設計方案。該方案闡述了虛擬機各個基本部分的詳細設計思路及需要注意的問題。目前已經實現了COMET虛擬機、CASL匯編器和TINY編譯器。我們將基于COMET虛擬機開發一個小型的文件系統,使得其應用于實際教學任務[1,4,5]。

參考文獻

[1]CASL匯編語言文本[M].中國計算機軟件專業技術資格和水平考試大綱

[2]劉福江,柴樹杉.CASL匯編器的設計與實現[J].計算機與信息技術.2006,7:76-78

[3](美)KennethC.Louden.編譯原理及實踐[M].北京:機械工業出版社,2003

[4](澳)JohnLions.萊昂氏UNIX源代碼分析[M].北京:機械工業出版社,2000

[5](美)BillBlunden.虛擬機的設計與實現——C/C++[M].北京:機械工業出版社,2003

[6]王亞平,陳甫舟.基于Linux平臺上的BOST虛擬機的硬件設計與實現[J].現代電子技術.2004,15:8-10