莊 寬,蔣烈輝,李軼民,王飛龍
(1.數(shù)學(xué)工程與先進(jìn)計(jì)算國(guó)家重點(diǎn)實(shí)驗(yàn)室,河南 鄭州450001;2.成都軍區(qū)政治部,四川 成都751104)
系統(tǒng)仿真器在支持精確異常機(jī)制上一般是通過定位基本塊、發(fā)現(xiàn)異常、回滾、重新翻譯執(zhí)行的方法,給仿真帶來(lái)一定的性能開銷[1-6]。支持精確異常一般分為在軟件層實(shí)現(xiàn)和硬件層實(shí)現(xiàn),QEMU[7]對(duì)精確異常的處理在軟件層實(shí)現(xiàn),采用定位基本塊塊首EIP,保存塊首處理器狀態(tài),當(dāng)異常在基本塊中發(fā)生時(shí),通過定位的EIP回滾到塊首位置,恢復(fù)塊首位置處理器狀態(tài),然后再進(jìn)行逐條翻譯執(zhí)行,可以定位到異常發(fā)生的位置,這種支持精確異常的方式由于需要回滾、解釋執(zhí)行,因而降低系統(tǒng)仿真的效率。Code Morphing Software(CMS)[8,9]通過使用影子寄存器 (shadow register)和可撤銷寫緩存硬件支持來(lái)實(shí)現(xiàn)精確異常,CMS將基本塊作為一個(gè)事物 (transaction)來(lái)執(zhí)行,用影子寄存器和可撤銷寫緩存來(lái)保存執(zhí)行過程中機(jī)器狀態(tài)變化以及對(duì)內(nèi)存的修改,只有當(dāng)沒有異常發(fā)生時(shí),才將機(jī)器狀態(tài)更新并將可撤銷寫緩存寫入內(nèi)存,當(dāng)異常發(fā)生時(shí),恢復(fù)監(jiān)測(cè)點(diǎn)機(jī)器狀態(tài),并進(jìn)行逐條的翻譯執(zhí)行以確保精確異常。CMS通過硬件的支持來(lái)實(shí)現(xiàn)精確異常,節(jié)省了其在精確異常方面的時(shí)間,從而提高了性能,由于CMS需要在處理器中使用大量的影子寄存器,因而此方法的多平臺(tái)通用性不強(qiáng)。
本文依托全系統(tǒng)仿真軟件AB (architecture bridge),其支持精確異常采用軟件層實(shí)現(xiàn),下文將用軟硬件協(xié)同優(yōu)化設(shè)計(jì)的方式來(lái)實(shí)現(xiàn)AB 的精確異常機(jī)制,最終使其對(duì)異常能快速準(zhǔn)確定位。
如圖1 所示,AB 主要對(duì)CPU、I/O、內(nèi)存等進(jìn)行仿真,通過循環(huán)的譯碼、翻譯、執(zhí)行來(lái)實(shí)現(xiàn)對(duì)系統(tǒng)的仿真。
圖1 AB整體結(jié)構(gòu)框架
AB的結(jié)構(gòu)包括由初始化、動(dòng)態(tài)二進(jìn)制翻譯器、內(nèi)存虛擬化、I/O 仿真4部分組成,如圖2所示。
初始化階段主要包括:解析用戶提交的虛擬機(jī)配置相關(guān)的命令行參數(shù)、為虛擬機(jī)建立物理內(nèi)存并建立映射關(guān)系、初始化二進(jìn)制翻譯器、初始化虛擬CPU、初始化I/O 子系統(tǒng)等。當(dāng)初始化結(jié)束后,啟動(dòng)動(dòng)態(tài)二進(jìn)制翻譯器,后者將根據(jù)當(dāng)前PC值從虛擬機(jī)內(nèi)存中取指、譯碼、翻譯并執(zhí)行,開始虛擬機(jī)的運(yùn)行。
動(dòng)態(tài)二進(jìn)制翻譯器:動(dòng)態(tài)二進(jìn)制翻譯器目前的主要特性是:以基本塊為翻譯單位,支持翻譯緩存,采用C 代碼仿真x86的復(fù)雜操作 (如訪存操作、涉及保護(hù)檢查的指令、可能引發(fā)異常的指令等),基于指令操作原語(yǔ)的翻譯。主要循環(huán)的進(jìn)行以下工作:異常檢測(cè)與派發(fā)、外部中斷檢測(cè)與派發(fā)、TB-CACHE查找、譯碼、翻譯、I-CACHE 刷新、上下文切換(prologue)、TB執(zhí)行、上下文切換(epilogue)。
內(nèi)存虛擬化:AB內(nèi)存虛擬化包括兩大模塊:一是物理內(nèi)存虛擬化,即使用宿主機(jī)的虛擬內(nèi)存來(lái)模擬客戶機(jī)的物理內(nèi)存,二是MMU 虛擬化,即仿真x86 的MMU。主要完成虛擬TLB 的查找,GVA (guest virtual address)到GPA (guest physical address)的轉(zhuǎn)化,GPA 到 HVA(host virtual address)的轉(zhuǎn)化。
I/O 仿真:虛擬化I/O 設(shè)備的方法一般有3 種:設(shè)備仿真、直接設(shè)備訪問和虛擬設(shè)備模型,AB目前以軟件方式實(shí)現(xiàn)了與P6處理器配套的典型I/O 接口和設(shè)備的仿真,包括芯片組 (i440fx/piix3)、PIC (i8259)、PIT (i8254)、鍵盤接口 (i8042)、IDE、標(biāo)準(zhǔn)VGA、UART 等。
圖2 AB的執(zhí)行
精確異常是指當(dāng)異常發(fā)生之前所有的指令都正確的執(zhí)行完畢[10,11],之后的所有指令都沒有執(zhí)行。滿足精確異常的處理器,在軟件層看來(lái),指令是順序執(zhí)行的。
在翻譯x86指令時(shí),AB僅在確保不會(huì)有異常發(fā)生時(shí)才會(huì)修改虛擬機(jī)的狀態(tài),因此當(dāng)異常發(fā)生時(shí),可以確保有正確的機(jī)器狀態(tài)。唯一的例外是EIP 的值,出于效率方面的考慮,AB在翻譯每條指令時(shí),并不生成指令來(lái)更新EIP的值,因此當(dāng)發(fā)生異常時(shí),應(yīng)該恢復(fù)EIP的值。
有3種情景需要考慮EIP的恢復(fù):
(1)取指 (譯碼)時(shí)發(fā)生異常 (#PF 或#GP)。取指時(shí),異常僅會(huì)發(fā)生在取基本塊的第一條指令時(shí) (如指令的第一個(gè)字節(jié)所在的頁(yè)不在內(nèi)存中),或發(fā)生在指令跨頁(yè)時(shí)(指令的尾部所在的頁(yè)不在內(nèi)存中)。對(duì)于第一種情況,由于處于塊邊界,因此EIP 的值可滿足精確異常的需要。對(duì)于第二種情況,AB在翻譯時(shí)會(huì)識(shí)別指令跨頁(yè)的情況 (返回DCDR_RIDE_PG),若該跨頁(yè)的指令不是基本塊的第一條指令,則結(jié)束基本塊。下次翻譯時(shí),跨頁(yè)指令將是基本塊的第一條指令,若發(fā)生異常,EIP的值可確保精確異常。
(2)TB執(zhí)行過程中發(fā)生異常。若指令非訪存指令 (如LJMP等)且可能引發(fā)異常,AB在翻譯x86指令時(shí)會(huì)生成OpenRisc指令來(lái)保存當(dāng)前EIP的值,以便異常發(fā)生時(shí)有正確的EIP值可用。若指令為普通訪存指令(如MOV等),當(dāng)發(fā)生異常時(shí),mmu_rd/wt()會(huì)根據(jù)翻譯基本塊時(shí)生成的EIP到HOST_PC 的對(duì)應(yīng)關(guān)系調(diào)用restore_eip ()來(lái)恢復(fù)EIP的值。由于restore_eip()實(shí)現(xiàn)上的限制 (利用__builtin_return_address(0)返回的HOST_PC,并判斷HOST_PC是否在TB范圍內(nèi)),要求在TB中直接調(diào)用mmu_rd/wt(),而不能在helper_xxx()中調(diào)用mmu_rd/wt()。
某些特殊的指令使用helper_xxx ()實(shí)現(xiàn)且需使用mmu_rd/wt()進(jìn)行隱含的訪存操作,如MOV DS,AX指令會(huì)訪問描述符表,可能發(fā)生#PF 異常,由于是在helper_xxx ()上下文中調(diào)用mmu_rd/wt(),因此restore_eip ()無(wú)法恢復(fù)出正確的EIP。對(duì)于這種指令,AB也應(yīng)在翻譯指令時(shí)將加入OpenRisc指令來(lái)保持當(dāng)前EIP的值,此時(shí)即使restore_eip ()無(wú)法恢復(fù)出正確的EIP,也可確保異常發(fā)生時(shí)有正確的EIP可用。
(3)中斷或異常處理過程中的異常。中斷或異常的遞交在cpu_exec()上下文中進(jìn)行,隱含著訪存操作 (訪問各種描述符表),并且可能引發(fā)各種保護(hù)異常 (包括#PF異常)。中斷總是在基本塊的邊界處理,因此可確保EIP的值滿足精確異常的要求。由于 (1)、 (2)的保證,可確保異常處理時(shí)EIP的值滿足精確異常的要求。若中斷或異常的遞交過程中再次發(fā)生異常,EIP的值仍是精確的。
AB在對(duì)客戶機(jī)指令翻譯完執(zhí)行之前,每次都要進(jìn)行異常檢測(cè),在進(jìn)行異常檢測(cè)前,都不會(huì)對(duì)機(jī)器的狀態(tài)進(jìn)行任何修改,這樣在一定程度上能支持精確異常,但其由于是嚴(yán)格按照程序順序的執(zhí)行,并且在每條指令尾部提交機(jī)器的狀態(tài),這種保守的機(jī)制對(duì)虛擬機(jī)的性能有一定的影響,然后對(duì)于一些指令重排、死代碼刪除等等的優(yōu)化工作受到了很多的限制。本文采用協(xié)同處理的方式,將軟件層面的精確異常支持由硬件部分維護(hù)與完成,降低AB 在精確異常方面的開銷,并且能給后期的軟件優(yōu)化工作帶來(lái)方便。
本文所使用處理器平臺(tái)為開源組織OpenCore組織維護(hù)與發(fā)展的處理器OpenRisc,OpenRisc處理器采用五級(jí)流水線和哈佛結(jié)構(gòu) (Harvard architecture),支持內(nèi)存管理單元(MMU),Cache,帶有基本的DSP功能,外部數(shù)據(jù)和地址總線采用Wishbone片上總線標(biāo)準(zhǔn),實(shí)現(xiàn)了基本指令集和向量指令,并支持指令擴(kuò)展,可以增加8 個(gè)自定義指令。具有完整的工具鏈,包括開源的軟件開發(fā)工具、C語(yǔ)言實(shí)現(xiàn)的cpu仿真模型、操作系統(tǒng),以及軟件應(yīng)用所需的函數(shù)庫(kù)等。其處理器Verilog HDL代碼開源,可供個(gè)人與企業(yè)開發(fā)使用。由于其諸多優(yōu)勢(shì),使得OpenRisc得到了廣泛的關(guān)注。
對(duì)精確異常的支持,是處理器的基本特性,因此,系統(tǒng)仿真中對(duì)異常的仿真不可避免。AB對(duì)異常仿真時(shí),每次更改處理器狀態(tài)都需要對(duì)異常進(jìn)行檢測(cè),只有在沒有任何異常產(chǎn)生時(shí),才會(huì)改變處理器狀態(tài),每次的異常檢測(cè)需要耗費(fèi)一定的時(shí)間,降低了仿真的效率。并且AB 在修改宿主機(jī)EIP時(shí)采用了 “懶惰算法”,即在翻譯后基本塊執(zhí)行過程中不更改宿主機(jī)EIP,當(dāng)一個(gè)基本塊執(zhí)行完畢時(shí)才修改宿主機(jī)EIP,當(dāng)異常發(fā)生時(shí),只需要恢復(fù)宿主機(jī)EIP。在恢復(fù)宿主機(jī)EIP時(shí),需要根據(jù)基本塊生成時(shí)的EIP和HOST_PC的關(guān)系,通過restore_eip (),進(jìn)行恢復(fù)。在恢復(fù)宿主機(jī)EIP時(shí),需要調(diào)用mmu_wd/rd查找對(duì)應(yīng)關(guān)系,然后恢復(fù)出宿主機(jī)EIP,需要相當(dāng)多的時(shí)鐘周期完成。因而,異常的檢測(cè)與恢復(fù)宿主機(jī)EIP 都對(duì)性能有一定的影響。鑒于AB在異常仿真方面對(duì)性能的影響,采用建立翻譯前EIP與翻譯后HOST _PC 對(duì)應(yīng)關(guān)系表,通過反向查表,定位EIP。
在系統(tǒng)仿真中,翻譯前的基本塊BB (Basic Block)中一條指令B1 可能對(duì)應(yīng)于T1、T2、…、Tn多條OpenRisc指令,當(dāng)翻譯的指令塊TB (Translation Block)執(zhí)行時(shí),如果在T2處發(fā)生異常,則需要通過異常的發(fā)生位置T2,查找到源指令B1,這樣才能定位異常,考慮到翻譯前的基本塊BB 與翻譯后的基本塊TB的對(duì)應(yīng)關(guān)系B1-> (T1,Tn),如圖3所示。
圖3 異常對(duì)應(yīng)關(guān)系
可以建立BTMT (basic block to translated block mapping table)表記錄翻譯前基本塊BB 的EIP 與翻譯后基本塊TB的HOST_PC對(duì)應(yīng)關(guān)系,見表1。
表1 EIP與HOST_PC關(guān)系
當(dāng)異常發(fā)生的位置Ti.begin≤Ti.except≤Ti.end 時(shí),則對(duì)應(yīng)的宿主機(jī)基本塊中異常發(fā)生位置指令Bi即可定位。因此,在異常發(fā)生位置Ti.except被定位時(shí),通過兩者的對(duì)應(yīng)關(guān)系表就能順利找到宿主機(jī)eip。
3.3.1 BTMT 表的實(shí)現(xiàn)
軟硬件協(xié)同處理方式大致分為兩種:一是,增加硬件電路協(xié)處理器單元,通過增加的硬件電路協(xié)處理單元,協(xié)同處理器完成相應(yīng)工作,以提高處理器的性能,但是這種方式帶來(lái)硬件協(xié)處理單元與處理器之間的通信開銷,并且這種硬件協(xié)處理器設(shè)計(jì)難度較大,不易實(shí)現(xiàn)。二是,修改處理器Verilog HDL 硬件描述語(yǔ)言,以增加特定的功能。這種只需要修改處理器Verilog HDL 硬件描述語(yǔ)言,改動(dòng)較少代碼就能實(shí)現(xiàn)相應(yīng)功能,便于實(shí)現(xiàn),但是很多處理器受到專利等保護(hù),不提供處理器Verilog HDL 代碼,造成了在實(shí)現(xiàn)上的難度。因此,結(jié)合OpenRisc開源的特性,我們用第二種方法,采用自定義指令的方式,使其增加特定的查找BTMT 表的功能。
BTMT 表的實(shí)現(xiàn)在翻譯時(shí)生成,在動(dòng)態(tài)二進(jìn)制翻譯器翻譯引擎translate()函數(shù)中實(shí)現(xiàn)記錄Basic Block的EIP與Translated Block的HOST_PC之間的BTMT,見表2。
表2 BTMT
翻譯前基本塊BB,對(duì)應(yīng)EIP 為B1、…、Bi、…、Bn,分別與翻譯后的TB建立一一對(duì)應(yīng)關(guān)系,T1、…、Ti、…、Tn分別為每個(gè)翻譯后指令塊的塊首,此種關(guān)系表格可以簡(jiǎn)化比對(duì)時(shí)間以及底層Verilog HDL 的復(fù)雜度,當(dāng)出現(xiàn)異常指令Ti≤Tii<Ti+1時(shí),即可定位Bi。
建立的BTMT 表在每次隨著基本塊翻譯生成時(shí)生成,當(dāng)基本塊執(zhí)行完畢,修改機(jī)器狀態(tài),將此基本塊對(duì)應(yīng)的BTMT 表無(wú)效,下一塊基本塊在翻譯之時(shí),置新生成的BTMT 有效。每次生成的BTMT 表放在OpenRisc處理器的高速緩存中,以在異常發(fā)生時(shí),由新定義指令調(diào)用,并返回比對(duì)結(jié)果。
3.3.2 自定義指令
所用平臺(tái)處理器OR1200為新指令的定義預(yù)留了8 個(gè)指令槽,這些指令槽有兩種格式,如圖4所示。
圖4 (a)指令格式的預(yù)留操作碼有0x1c、0x1d、0x1e、0x1f,圖4 (b)指令格式的預(yù)留操作碼有0x3c、0x3d、0x3e、0x3f,由于需要通過翻譯基本塊的HOST_PC查找到客戶機(jī)EIP,因此選擇第二種格式作為新增加指令的格式。
圖4 OR1200自定義指令格式
添加指令包括兩方面工作:一是,硬件層修改。修改OR1200 Verilog HDL 的處理器源碼文件or1200 _defines.v、or1200_cpu.v、or1200_ctrl.v等文件中分別增加相應(yīng)修改:①對(duì)or1200_defines.v的修改:添加對(duì)應(yīng)指令操作碼:`define OR1200_OR32_h(yuǎn)te 6'b111110//l.the。②對(duì)or1200_ctrl.v的修改:增加BTMT 表控制比對(duì)邏輯單元以及新指令取指譯碼的控制單元,并輸出到ALU 模塊的比對(duì)信號(hào),使得新指令能夠?qū)⒌腂TMT 表進(jìn)行比對(duì),產(chǎn)生比對(duì)結(jié)果。③對(duì)or1200_alu.v的修改:添加運(yùn)算控制邏輯,并控制返回輸出。新指令l.hte定義l.hte操作碼為0x3c,機(jī)器碼為0xf1e10000,RD 寄存器位置為保存宿主機(jī)EIP的寄存器r15,寄存器RA 位置為保存HOST_PC 寄存器r16,寄存器RB 位置保留,L、K 相應(yīng)位置均保留機(jī)器。二是,軟件層修改。新定義的指令不能被交叉編譯器識(shí)別,讓新定義的指令在機(jī)器上執(zhí)行,還需修改相關(guān)部分。具體做法有兩種:一是,修改編譯器,增加對(duì)新指令的支持,這種做法較為復(fù)雜,而且會(huì)影響生成代碼的質(zhì)量。二是,修改匯編器,增加內(nèi)嵌機(jī)器碼以及定義新指令到二進(jìn)制編碼的映射等實(shí)現(xiàn)新指令。本次實(shí)現(xiàn)采取第二種方式,首先在交叉編譯工具文件binutils/opcodes/or32-opc.c 加入: {"l.hte","rD,rA","11 0xC DDDDD AAAAA----------------",EF (l_h(yuǎn)te),0,it_unknown},然后用內(nèi)聯(lián)匯編_asm_ _volatile_(“l(fā).hte”)調(diào)用新定義指令。
實(shí)驗(yàn)硬件平臺(tái)利用以O(shè)R1200處理器所搭建的協(xié)同處理仿真平臺(tái),系統(tǒng)平臺(tái)為OpenRisc linux,內(nèi)核版本為linux 3.4,軟件平臺(tái)為AB 系統(tǒng)仿真器、fast-tty-linux.img系統(tǒng)鏡像,以及SPEC 2006測(cè)試集的部分子測(cè)試程序。
由于OR1200處理器性能的限制以及平臺(tái)部分資源的不足,實(shí)驗(yàn)選取SPEC 2006 測(cè)試集的4 個(gè)測(cè)試程序400.perlbench、445.gobmk、458.sjeng、462.libquantum對(duì)系統(tǒng)在精確異常方面的開銷進(jìn)行測(cè)試,結(jié)果如圖5所示。
通過對(duì)增加精確異常的協(xié)處理部分前后的程序運(yùn)行時(shí)間進(jìn)行比較,發(fā)現(xiàn)增加精確異常協(xié)處理部分后,測(cè)試程序的運(yùn)行時(shí)間比沒有加入?yún)f(xié)處理部分分別有9.16%、14.32%、13.56%、10.48%降低,由于測(cè)試程序400.perlbench 和462.libquantum 程序沒有太多的異常發(fā)生,性能提升相對(duì)較小,而測(cè)試程序458.sjeng和445.gobmk 異常發(fā)生相對(duì)較多,對(duì)性能提升比前兩個(gè)有較為明顯。
圖5 優(yōu)化前后執(zhí)行時(shí)間
因此,對(duì)于觸發(fā)異常較少程序,此方法對(duì)性能的提升相對(duì)較小,而對(duì)于一些局部性不好或者容易觸發(fā)異常的程序,此方法對(duì)性能的提升比較明顯。
本文分析了AB 系統(tǒng)仿真器在支持精確異常方面的不足,以及在純軟件實(shí)現(xiàn)上的性能損耗,結(jié)合開源處理器OR1200,通過更改其Verilog HDL硬件描述語(yǔ)言,增加新定義指令,以完成HOST_PC到宿主機(jī)EIP的轉(zhuǎn)換,經(jīng)過SPEC2006測(cè)試集測(cè)試,性能比優(yōu)化前提高了9.16%~14.32%,根據(jù)其測(cè)試集程序的不同,優(yōu)化的效果也不盡想同。由于系統(tǒng)仿真器AB 在優(yōu)化過程中增加了TB-cache、塊鏈等機(jī)制,給精確異常帶來(lái)困難,此方法有助于今后在軟件層面的深度優(yōu)化。因本文所述方式需改動(dòng)底層硬件描述語(yǔ)言以及交叉編譯工具鏈,其移植性不高。
以上方法雖然在實(shí)踐上比較困難,但對(duì)于一些國(guó)產(chǎn)處理器的系統(tǒng)仿真器優(yōu)化,有一定的借鑒意義。
[1]DONG Weiyu,WANG Lixin,JIANG Liehui,et al.Accelerate X86system emulation with protection cache [J].Computer Engineering and Design,2013,34 (2):606-610 (in Chinese).[董衛(wèi)宇,王立新,蔣烈輝,等.基于保護(hù)緩存的X86系統(tǒng)仿真優(yōu)化[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(2):606-610.]
[2]Jair Fajaido Junior,Mateus B Rutzig,Antonio CS Beck,et al.Towards an adaptable multiple-ISA Re-configurable processor[G].Lecture Notes in Computer Science 6578:7th International Symposium on Applied Reconfigurable Computing,2011:157-168.
[3]HU Wei,WANG Jian,GAO Xiang,et al.GODSON-3:A scalable multicore RISC processor with emulation [J].IEEE Micro,2009,29 (2):17-29.
[4]Fan DR,Li XW,Li GJ,et al.New methodologies for parallel architecture[J].Journal of Computer Science and Technology,2011,26 (4):578-587.
[5]DENG Haipeng.Reorganization and optimization of the backend code in dynamic binary translation [D].Shanghai:Shanghai Jiao Tong University,2011 (in Chinese).[鄧海鵬.動(dòng)態(tài)二進(jìn)制翻譯后端代碼熱路徑的重組優(yōu)化 [D].上海:上海交通大學(xué),2011.]
[6]SUN Tingtao.Branch analysis and optimization in dynamic binary translation [D].Shanghai:Shanghai Jiao Tong University,2010 (in Chinese). [孫廷韜.動(dòng)態(tài)二進(jìn)制翻譯中跳轉(zhuǎn)分析與優(yōu)化 [D].上海:上海交通大學(xué),2010.]
[7]QEMU.Change Log/1.2[EB/OL].[2012-09-05].http://wiki.qemu.org/ChangeLog/1.2.
[8]YU Lu.Research on improving mechanism of precise exception of QEMU [D].Wuhan:Huazhong University of Science &Technology,2008 (in Chinese).[余璐.一種改進(jìn)QEMU 精確異常處理機(jī)制的研究 [D].武漢:華中科技大學(xué),2008.]
[9]CHEN Wei.Research on dynamic binary translation based on Co-designed virtual machine[D].Changsha:National University of Defense Technology,2010 (in Chinese).[陳微.基于動(dòng)態(tài)二進(jìn)制翻譯的協(xié)同設(shè)計(jì)虛擬機(jī)關(guān)鍵技術(shù)研究 [D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),2010.]
[10]CHEN Haifeng.Research on ISA mapping of Co-design X86 emulation [D].Zhengzhou:Information Engineering University,2012 (in Chinese).[陳海峰.協(xié)同設(shè)計(jì)X86仿真指令集映射技術(shù)研究 [D].鄭州:信息工程大學(xué),2012.]
[11]CHEN Qiao,JIANG Liehui,DONG Weiyu,et al.Simulator research based on dynamic binary translation technology [J].Computer Engineering,2011,37 (20):277-279 (in Chinese).[陳喬,蔣烈輝,董衛(wèi)宇,等.基于動(dòng)態(tài)二進(jìn)制翻譯技術(shù)的仿真器研究[J].計(jì)算機(jī)工程,2011,37 (20):277-279.]