COMET虛擬機(jī)設(shè)計分析論文
時間:2022-10-11 11:08:00
導(dǎo)語:COMET虛擬機(jī)設(shè)計分析論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要comet虛擬機(jī)是一種為了教學(xué)目的而定義的虛擬機(jī),其結(jié)構(gòu)雖然簡單,但功能完備,可作為一種教學(xué)輔助工具,幫助大學(xué)本科學(xué)習(xí)計算機(jī)課程的學(xué)生更好地理解現(xiàn)在計算機(jī)的結(jié)構(gòu)和工作原理。作者基于原有COMET虛擬機(jī)定義,改進(jìn)并實(shí)現(xiàn)了一個功能相對完備的虛擬機(jī)。COMET虛擬機(jī)的開發(fā)主要突出兩個原則:簡單性和可移植性。本文將對COMET虛擬機(jī)的開發(fā)細(xì)節(jié)做一個完整的描述。
關(guān)鍵詞COMET虛擬機(jī);設(shè)計;實(shí)現(xiàn)
1引言
虛擬機(jī)就是一臺假想的機(jī)器。一臺虛擬機(jī)與一臺真實(shí)存在的計算機(jī)不同之處在于前者只是一個技術(shù)規(guī)范。虛擬機(jī)技術(shù)從很早就開始研究,并且在軟件技術(shù)中廣為應(yīng)用。目前,高度可移植的JAVA編程語言采用的就是虛擬機(jī)技術(shù)。虛擬機(jī)不僅有廣泛的商業(yè)應(yīng)用價值,同時也可作為一種很好的教學(xué)輔助工具。通過虛擬機(jī),學(xué)生可以很好地學(xué)習(xí)理解計算機(jī)的結(jié)構(gòu)和工作原理。因此,設(shè)計并實(shí)現(xiàn)一個簡單的虛擬機(jī)有很好的教學(xué)意義[4,5]。
COMET虛擬機(jī)開始只是作為CASL匯編語言的運(yùn)行平臺而設(shè)計,并由中國計算機(jī)軟件專業(yè)技術(shù)資格和水平考試大綱中給出的CASL匯編語言文本定義(下文將簡稱為文本)。作者在文本的基礎(chǔ)上,對COMET虛擬機(jī)的功能進(jìn)行了一定的改進(jìn)和擴(kuò)充,并實(shí)現(xiàn)了一個功能完善的虛擬機(jī)實(shí)例[1]。
2COMET虛擬機(jī)設(shè)計
2.1邏輯結(jié)構(gòu)
圖1COMET虛擬機(jī)結(jié)構(gòu)
COMET虛擬機(jī)是一臺基于寄存器模型結(jié)構(gòu)的計算機(jī)。COMET虛擬機(jī)系統(tǒng)主要包括三個部分:中央處理器(CPU)、存儲器和出入輸出設(shè)備。COMET計算機(jī)的邏輯結(jié)構(gòu)如圖1所示。
CPU是由寄存器、算術(shù)邏輯部件和控制邏輯組成。寄存器在程序運(yùn)行時存儲計算過程的各種信息;算術(shù)邏輯部件的功能是進(jìn)行所有的算術(shù)和邏輯運(yùn)算。由于COMET計算機(jī)是虛擬的計算機(jī),因此,它的控制邏輯對于我們是透明的[1,4,5]。
2.2寄存器
COMET虛擬機(jī)有5個通用寄存器GR(16位),一個指令計數(shù)器PC(16位)和一個標(biāo)志寄存器FR(2位)。
GR(通用寄存器)5個通用寄存器的編號為0、1、2、3、4,分別記為GR0、GR1、GR2、GR3、GR4。這些通用寄存器用于算術(shù)、邏輯、移位等運(yùn)算,其中GR1、GR2、GR3、GR4通用寄存器兼做變址寄存器。另外,GR4還兼做棧指針(SP)用,棧指針是存放棧頂?shù)刂酚玫募拇嫫鳌?/p>
PC(指令計數(shù)器)在執(zhí)行指令的過程中,PC中存放著正在執(zhí)行的指令的第一個字的地址。當(dāng)指令執(zhí)行結(jié)束時,一般是把PC的內(nèi)容加上當(dāng)前指令的長度(不同指令的長度不同),只有在執(zhí)行轉(zhuǎn)移指令且條件成立時,才將轉(zhuǎn)移指令地址置入PC中。
FR(標(biāo)志寄存器)在ADD、SUB、MUL、DIV、MOD、AND、OR、EOR、CPA、CPL、SLA、SRA、SLL、SRL、LEA等指令執(zhí)行結(jié)束時,根據(jù)執(zhí)行的結(jié)果,將FR設(shè)置成00、01或10(大于、等于、小于或負(fù)數(shù)、零、正數(shù))。它們不會因其他指令的執(zhí)行而改變。
2.3存儲器
COMET虛擬機(jī)是一臺16位的定點(diǎn)計算機(jī),主存儲器的基本存儲單位是字,總?cè)萘繛?5536(216=16k)字,各個字的地址按照0000-FFFF(十六進(jìn)制)編號。一個字的16位二進(jìn)制采用從左到右次序編號,如圖2所示。
圖2字節(jié)順序
COMET虛擬機(jī)可以處理三種數(shù)據(jù),即字符數(shù)據(jù)、帶符號整數(shù)、地址數(shù)據(jù)。字符數(shù)據(jù)采用16位的Unicode字符;帶符號整數(shù)采用二進(jìn)制補(bǔ)碼表示,可表示的數(shù)值范圍為[-215,215-1];地址數(shù)據(jù)為無符號的整數(shù),范圍是[0,216-1]。
在實(shí)現(xiàn)的COMET虛擬機(jī)中,內(nèi)存的高1k字保留用于各種專用的外設(shè)寄存器[1,3]。
2.4指令系統(tǒng)
COMET虛擬機(jī)和文本相比,新增加了HALT、MUL、SUB、MOD四條指令。下面只給出HALT、MUL、SUB、MOD四條指令的說明,其他的指令可以參考文本。
HALT指令執(zhí)行停機(jī)操作,占一個字長。MUL指令執(zhí)行乘法操作,操作規(guī)則和ADD等指令相似,占2個字長。SUB指令執(zhí)行除法操作,操作規(guī)則和ADD指令相似,占2個字長。MOD指令執(zhí)行取模操作,操作規(guī)則和ADD指令相似,占2個字長。
2.5指令格式
COMET虛擬機(jī)機(jī)器指令一般包含三種信息:OP,GR,XR,ADR。其中OP為機(jī)器指令的編號,對應(yīng)第一個字的[0-7]位;GR為通用寄存器編號,對應(yīng)第一個字中的[8-11]位;XR為變址寄存器編號,對應(yīng)第一個字的[12-15]位,[12-15]位為0表示沒有變址(GR0不能作為變址寄存器);ADR為操作數(shù),對應(yīng)地二個字的[0-15]位。如果一個指令不含某種信息(例如,沒有ADR),則忽律該字段。OP、GR、XR、ADR的存儲細(xì)節(jié)如圖3所示。
圖3指令格式
根據(jù)指令操作數(shù)據(jù)的類型的不同,可將COMET虛擬機(jī)的機(jī)器指令分為四種:寄存器-存儲器型,存儲器型,寄存器型,空操作數(shù)型。如果一個COMET虛擬機(jī)指令不涉及主存儲器操作(無ADR),則為1個字長,其他均為2個字長。
2.6字節(jié)碼格式
字節(jié)碼文件是COMET虛擬機(jī)的可執(zhí)行文件。在啟動虛擬機(jī)時,由命令行中的參數(shù)給出字節(jié)碼文件名。字節(jié)碼文件含有程序的長度、裝載位置、程序指令等信息。虛擬機(jī)依據(jù)這些信息,將字節(jié)碼中的指令從二級存儲器裝載到相應(yīng)的虛擬機(jī)內(nèi)存。這一系列操作和操作系統(tǒng)的程序加載器的工作情況類似[4]。
COMET虛擬機(jī)的字節(jié)碼文件是一種二進(jìn)制格式文件,格式如圖4所示。
圖4字節(jié)碼結(jié)構(gòu)
其中addr為字節(jié)碼在虛擬機(jī)內(nèi)存的裝載地址,len為字節(jié)碼中指令的個數(shù)(不包含len和addr),ins1、ins2、…、insn為要載入虛擬機(jī)的指令。
2.7輸入輸出設(shè)備
文本中并沒有明確定義COMET虛擬機(jī)的輸入輸出設(shè)備,只是給出IN、OUT幾個IO操作宏指令。在這里,我們采用將外部設(shè)備寄存器在內(nèi)存中統(tǒng)一編址的方法來處理輸入和輸出設(shè)備[1,3]。
COMET虛擬機(jī)默認(rèn)的I/O設(shè)備是鍵盤和顯示器。利用操作系統(tǒng)提供的從定向功能用戶也可以將它們重新定向到其他的設(shè)備。
COMET虛擬機(jī)輸入輸出設(shè)備的兩個專用寄存器為:IO_ADDR、IO_FLAG,分別對應(yīng)0xFD100、xFD10地址內(nèi)存。IO_ADDR用于保存要傳輸數(shù)據(jù)的內(nèi)存地址;IO_FLAG為IO設(shè)備的標(biāo)志位,其8-15位是要傳輸數(shù)據(jù)的個數(shù)(0表示無IO),7位表示輸入或輸出(1表示輸入,0為輸出),6位在出現(xiàn)IO錯誤時設(shè)置,3-5位為傳輸?shù)念愋?有字符、八進(jìn)制、十進(jìn)制、十六進(jìn)制等),0-2位保留。
2.8調(diào)試器
COMET調(diào)試器是一個內(nèi)嵌在虛擬機(jī)里的機(jī)器級的調(diào)試器。當(dāng)需要調(diào)試一個COMET虛擬機(jī)的程序時,只需要在啟動COMET虛擬機(jī)的時給出相應(yīng)的命令參數(shù)就啟動調(diào)試功能了[2,4]。
COMET調(diào)試器的基本功能有:顯示幫助(help),運(yùn)行程序直到停止(go),分步執(zhí)行(stepn),跳轉(zhuǎn)程序(jump),顯示寄存器內(nèi)容(regs),顯示內(nèi)存數(shù)據(jù)(dMem),顯示內(nèi)存指令(iMem),修改內(nèi)存數(shù)據(jù)(alter),遍歷指令(trace),指令記數(shù)功能(print),重新裝載字節(jié)碼(clear),退出調(diào)試器(quit)。每個調(diào)試命令的具體用法可以參考COMET虛擬機(jī)的幫助文件。
3COMET虛擬機(jī)實(shí)現(xiàn)
3.1虛擬機(jī)數(shù)據(jù)結(jié)構(gòu)
structcomet
{
off_tpc;
shortfr;
shortgr[5];
shortmem[MEMSIZE];
}cmt;
虛擬機(jī)結(jié)構(gòu)變量cmt是一個全局變量,成員分別為:指令計數(shù)器(pc)、標(biāo)志寄存器(fr)、通用寄存器(gr)、存儲器(mem)。將cmt設(shè)計為全局變量的優(yōu)點(diǎn)是個函數(shù)不用傳遞復(fù)雜的結(jié)構(gòu)體參數(shù),缺點(diǎn)是每個進(jìn)程同時只能有一個虛擬機(jī)實(shí)例。
3.2主函數(shù)
int
main(intargc,char*argv[])
{
init(argc,argv);
if(debug)comet_debug();
elsewhile(comet_step());
fclose(source);
return0;
}
函數(shù)init首先初始化COMET虛擬機(jī)并裝載字節(jié)碼,如果發(fā)生錯誤則停止。然后根據(jù)調(diào)試器狀態(tài),選擇運(yùn)行虛擬機(jī)的方式。如果調(diào)試開關(guān)(debug)被設(shè)置,則調(diào)用comet_debug函數(shù)在調(diào)試狀態(tài)下運(yùn)行COMET虛擬機(jī)。如果沒有打開調(diào)試開關(guān),則循環(huán)調(diào)用單步執(zhí)行函數(shù)comet_step,直到程序結(jié)束[1,2]。
3.3字節(jié)碼載入
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用于記錄讀取字節(jié)碼的數(shù)目,如果n小于相應(yīng)的值,則發(fā)生字節(jié)碼裝載錯誤。變量flag用于保存字節(jié)碼裝載信息,分別字節(jié)碼裝載地址和字節(jié)碼大小。
COMET字節(jié)碼設(shè)計比較簡單,也存在很多不足。例如,沒有標(biāo)志文件格式的魔數(shù),沒有更完善的錯誤檢測措施。我們的目的是讓讀者了解字節(jié)碼的工作原理,因此只給出了一種最簡單的實(shí)現(xiàn)[1,2,4]。
3.4指令解析
指令的解析一般包含這個幾個過程:取指令,解碼,執(zhí)行。其中解碼對虛擬機(jī)的執(zhí)行效率有很大的影響[5]。這里采用下標(biāo)索引技術(shù)來解碼指令。具體代碼如下:
voidcomet_ld(void);/*LD指令*/
voidcomet_ld(void);/*ST指令*/
voidcomet_ld(void);/*LEA指令*/
/*其他指令函數(shù)聲明*/
intcomet_step(void)
{
staticvoid(*comet_op)()={
comet_ld,comet_st,comet_lea,
/*其他指令執(zhí)行函數(shù)指針*/
};
/*解析指令,存放在op中*/
shortop=get_op();
/*執(zhí)行op對應(yīng)的代碼*/
(*comet_op[op])();
/*返回執(zhí)行狀態(tài)*/
returnval;
}
例如,有指令LEA,其對應(yīng)的機(jī)器碼為031,那么將通過函數(shù)指針數(shù)組comet_op直接定位到(*comet_op[031])函數(shù),即并執(zhí)行相應(yīng)的comet_lea函數(shù)。
3.5輸入輸出設(shè)備
COMET虛擬機(jī)在解析每個指令前,先讀取IO設(shè)備狀態(tài)寄存器IO_FLAG中的值,如果IO_FLAG被設(shè)置,則執(zhí)行相應(yīng)的IO操作[3]。具體代碼如下:
void
comet_io(void)
{
switch(cmt.mem[IO_FLAG]&IO_TYPE)
{
caseIO_NULL:
/*無IO操作*/
caseIO_OCT&IO_IN:
/*八進(jìn)制輸入*/
caseIO_DEC&IO_IN:
/*十進(jìn)制輸入*/
caseIO_HEX&IO_IN:
/*十六進(jìn)制輸入*/
caseIO_OCT&IO_OUT:
/*八進(jìn)制輸出*/
caseIO_DEC&IO_OUT:
/*十進(jìn)制輸出*/
caseIO_HEX&IO_OUT:
/*十六進(jìn)制輸出*/
default:
/*未知IO類型*/
}
/*重置IO狀態(tài)寄存器IO_FLAG*/
}
3.6調(diào)試器
調(diào)試程序是建立和單步執(zhí)行的COMET虛擬機(jī)之上的。當(dāng)沒有打開調(diào)試功能時,循環(huán)執(zhí)行COMET虛擬機(jī)字節(jié)碼程序,直到停止。當(dāng)打開了調(diào)試功能時,調(diào)試函數(shù)debug根據(jù)調(diào)試命令,執(zhí)行相應(yīng)步的指令、顯示或操作相關(guān)的數(shù)據(jù)。
/*各種調(diào)試命令*/
typedefenum
{
GO,STEP,JUMP,REGS,
IMEM,DMEM,ALTER,
TRACE,PRINT,CLEAR,
HELP,QUIT
}DbType;
/*調(diào)試函數(shù)*/
void
comet_debug(void)
{
intcmd;/*保存調(diào)試命令*/
while(1){
/*讀調(diào)試命令*/
switch(cmd){
caseHELP:/*幫助文件*/
caseGO:/*執(zhí)行程序*/
caseSTEP:/*分步執(zhí)行*/
/*其他調(diào)試命令*/
default:/*未知命令*/
}
}
}
調(diào)試函數(shù)comet_debug根據(jù)不同的調(diào)試命令執(zhí)行相應(yīng)的操作,并顯示虛擬機(jī)狀當(dāng)前的狀態(tài)信息。
4運(yùn)行虛擬機(jī)
下面通過一個求(1+2+…+n)的程序,來介紹其在COMET虛擬機(jī)上的執(zhí)行的流程。程序的字節(jié)碼由相關(guān)的工具生成,保存為et文件(后綴為comet)。
4.1普通運(yùn)行
輸入命令:cometsum
在COMET虛擬機(jī)獲得sum參數(shù)后,會自動識別為et字節(jié)碼文件。
輸入100,表示求1+2+…+100的和。
COMET虛擬機(jī)輸出:
===============
COMET虛擬計算機(jī)
===============
100
5050[root@knuth/root]#
表示1+2+…+100等于5050,結(jié)果正確。
4.2調(diào)試運(yùn)行
輸入命令:comet–dsum
===============
COMET虛擬計算機(jī)
===============
調(diào)試(幫助輸入help)...
輸入命令:t
指令顯示功能打開
輸入命令:p
指令計數(shù)功能打開
輸入命令:r
顯示寄存器數(shù)據(jù)
GR[0]=0PC=0
GR[1]=0SP=fc00
GR[2]=0FR=01
GR[3]=0
輸入命令:d
顯示內(nèi)存數(shù)據(jù)
mem[0]=1200
輸入命令:i
顯示內(nè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
執(zhí)行指令數(shù)目=71
輸入命令:q
退出調(diào)試...
其中t、p、d、r、g分別是調(diào)試命令trace、print、dMem、regs、go的縮寫;3(mem[11]的下一行)是用戶輸入的數(shù)據(jù),不是調(diào)試命令。6(mem[4f]行)表示1+2+3的和為6。
COMET虛擬機(jī)內(nèi)嵌的調(diào)試器功能非常強(qiáng)大,熟練掌握后對COMET虛擬機(jī)的程序開發(fā)會有很大的幫助。調(diào)試命令細(xì)節(jié)可以通過幫助命令help獲得。
5結(jié)語
本文給出了COMET虛擬機(jī)的硬件設(shè)計方案。該方案闡述了虛擬機(jī)各個基本部分的詳細(xì)設(shè)計思路及需要注意的問題。目前已經(jīng)實(shí)現(xiàn)了COMET虛擬機(jī)、CASL匯編器和TINY編譯器。我們將基于COMET虛擬機(jī)開發(fā)一個小型的文件系統(tǒng),使得其應(yīng)用于實(shí)際教學(xué)任務(wù)[1,4,5]。
參考文獻(xiàn)
[1]CASL匯編語言文本[M].中國計算機(jī)軟件專業(yè)技術(shù)資格和水平考試大綱
[2]劉福江,柴樹杉.CASL匯編器的設(shè)計與實(shí)現(xiàn)[J].計算機(jī)與信息技術(shù).2006,7:76-78
[3](美)KennethC.Louden.編譯原理及實(shí)踐[M].北京:機(jī)械工業(yè)出版社,2003
[4](澳)JohnLions.萊昂氏UNIX源代碼分析[M].北京:機(jī)械工業(yè)出版社,2000
[5](美)BillBlunden.虛擬機(jī)的設(shè)計與實(shí)現(xiàn)——C/C++[M].北京:機(jī)械工業(yè)出版社,2003
[6]王亞平,陳甫舟.基于Linux平臺上的BOST虛擬機(jī)的硬件設(shè)計與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù).2004,15:8-10
- 上一篇:研究室主任工作述職報告
- 下一篇:檢察院副檢察長述職報告