蔡慧玲 ,劉博
多機(jī)器人系統(tǒng)與傳統(tǒng)的單一機(jī)器人相比有著諸多優(yōu)點(diǎn)如[1]:機(jī)器人間可以并行作業(yè)提高生產(chǎn)效率;可以相互協(xié)作完成復(fù)雜任務(wù);部分機(jī)器人失效不會(huì)影響整體作業(yè)提高了可靠性。但是異構(gòu)多中機(jī)器人系統(tǒng),由于來(lái)自不同生產(chǎn)商或不同時(shí)期產(chǎn)品,各自平臺(tái)可能不一致,存在異構(gòu)性,這給代碼的移植帶來(lái)了困難。虛擬機(jī)作為軟硬件之間的中間層,使軟件的二進(jìn)制代碼不再直接運(yùn)行在物理機(jī)器之上,通過(guò)代碼解釋或者二進(jìn)制翻譯的方法,轉(zhuǎn)換為目標(biāo)處理器的可執(zhí)行代碼,來(lái)達(dá)到實(shí)現(xiàn)支持多指令集的目的。
在動(dòng)態(tài)二進(jìn)制翻譯中,翻譯是即時(shí)進(jìn)行的,對(duì)效率有很高的要求。一般的動(dòng)態(tài)二進(jìn)制翻譯,都采用基于軟件的方法實(shí)現(xiàn),即翻譯-執(zhí)行-再翻譯-再執(zhí)行的軟件執(zhí)行主流程。所以在這樣的 ISA兼容過(guò)程種,解釋執(zhí)行和翻譯代碼的時(shí)空開(kāi)銷較大,用特殊的硬件資源來(lái)加速動(dòng)態(tài)二進(jìn)制翻譯是一個(gè)直接的選擇。為此,本文提出了一種基于軟硬件協(xié)同設(shè)計(jì)的動(dòng)態(tài)二進(jìn)制翻譯實(shí)現(xiàn)方法。
典型的動(dòng)態(tài)二進(jìn)制翻譯的工作流程為:二進(jìn)制翻譯單元翻譯以源機(jī)器程序計(jì)數(shù)器(Source Program Counter,SPC)為輸入,首先在目標(biāo)代碼塊緩存(Target Code Cache, TCache)中尋找是否有已翻譯過(guò)的代碼塊對(duì)應(yīng)該SPC值。如果命中(Hit)即表明該基本快已經(jīng)被翻譯,則跳轉(zhuǎn)至該目標(biāo)代碼直接執(zhí)行;如果缺失(Miss),則開(kāi)始翻譯工作。翻譯工作包括構(gòu)造代碼塊,翻譯代碼塊生成目標(biāo)代碼塊(Target Code Block,TBlock),最后存入TCache空間,如圖1所示。
二進(jìn)制代碼基本塊(Basic Block)是動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)中,進(jìn)行代碼翻譯的基本單位,即一段翻譯后代碼片段(Translated Code Segment,TCS)所對(duì)應(yīng)的源結(jié)構(gòu)指令片段。動(dòng)態(tài)二進(jìn)制翻譯中,執(zhí)行一個(gè)基本塊所用的時(shí)間開(kāi)銷分析可以用等式(1)表示。其中 linked代表基本塊鏈接的比率,lookup time是查找 SPC-TPC map表的時(shí)間。
圖1 動(dòng)態(tài)二進(jìn)制翻譯工作流程圖
通過(guò)對(duì)進(jìn)程級(jí)虛擬機(jī)CrossBit[2]的SPEC2000測(cè)試數(shù)據(jù)分析,存在如下影響性能的主要因素:
⑴ TCache的管理單元部分。翻譯好的目標(biāo)指令存儲(chǔ)在二進(jìn)制翻譯的用戶空間TCache中,下一個(gè)要執(zhí)行的基本塊的是否已經(jīng)翻譯完成,必須由查看 SPC(Source Program Counter)到TPC(Target Program Counter)的映射表獲得,由于一個(gè)程序中基本塊數(shù)量的龐大,映射查詢操作成為頻繁事件,那么映射查詢時(shí)間(Lookup Time)相應(yīng)增大[3]。將TCache的管理和查找由硬件實(shí)現(xiàn),以指令的形式實(shí)現(xiàn)查找操作,這樣將lookup 開(kāi)銷降到最低。同時(shí),采用硬件實(shí)現(xiàn)查找大大減少了 lookup時(shí)間。在查找的過(guò)程中也可以收集執(zhí)行信息,以利于將來(lái)profiling優(yōu)化程序中的熱路徑分析[4]。
⑵ 執(zhí)行單元和二進(jìn)制翻譯單元以及TCache管理單元的上下文信息緩存以及恢復(fù)(context switch time)。當(dāng)處理器從目標(biāo)代碼的執(zhí)行狀態(tài),切換到對(duì)源二進(jìn)制代碼的翻譯狀態(tài)時(shí),需要做上下文的保存和恢復(fù),在翻譯執(zhí)行過(guò)程對(duì)每一個(gè)基本塊都需要這樣做,無(wú)法避免頻繁切換帶來(lái)的高開(kāi)銷。那么,在本文的設(shè)計(jì)中將動(dòng)態(tài)二進(jìn)制翻譯單元獨(dú)立出來(lái),從原來(lái)的解釋-執(zhí)行-再翻譯-再執(zhí)行的主流程中抽離出來(lái),由獨(dú)立的硬件單元實(shí)現(xiàn),從而避免頻繁切換帶來(lái)的性能開(kāi)銷。
⑶ 翻譯單元的構(gòu)造對(duì)性能的影響。動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)的總的執(zhí)行時(shí)間,由指令解釋執(zhí)行時(shí)間、代碼翻譯開(kāi)銷、翻譯后代碼執(zhí)行時(shí)間以及profile開(kāi)銷幾部分組成:
其中Iinterp為系統(tǒng)解釋執(zhí)行的源結(jié)構(gòu)指令數(shù);Tinterp為解釋執(zhí)行一條源結(jié)構(gòu)指令的平均時(shí)間;Itrans為翻譯的源結(jié)構(gòu)指令數(shù);Ttrans為翻譯一條指令的平均時(shí)間:Vcmt和Vcnl分別為提交和取消的翻譯后代碼VLIW條數(shù);Tvliw為條VLIW的平均執(zhí)行時(shí)間;Nprof為profile代碼執(zhí)行次數(shù);Tprof為profile代碼的平均執(zhí)行時(shí)間。構(gòu)造高效的硬件翻譯對(duì)系統(tǒng)的系能有著重要影響。硬件支持的翻譯單元降低了軟件的開(kāi)銷,提高系統(tǒng)實(shí)時(shí)性。
實(shí)現(xiàn)兼容性和高性能的目標(biāo),要求將源體系結(jié)構(gòu)的資源高效地映射到目標(biāo)體系結(jié)構(gòu)中。這涉及到硬件支持單元與主處理器核心的協(xié)作,其設(shè)計(jì)關(guān)鍵在于合適地劃分軟硬件界面,在低硬件復(fù)雜性下實(shí)現(xiàn)動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)整體的高性能?;谏鲜鲂阅苣P椭械姆治觯覀兲岢龌谟布С值亩M(jìn)制翻譯系統(tǒng)。
系統(tǒng)的總體結(jié)構(gòu)分為3部分:軟件層包括x86可執(zhí)行文件的加載器和虛擬機(jī)IP核驅(qū)動(dòng)程序以及Linux操作系統(tǒng),硬件部分包括PowerPC處理器、內(nèi)存和虛擬機(jī)IP核。其中虛擬機(jī)的IP核主要由兩部分組成:二進(jìn)制翻譯器和TCache管理器。軟件與硬件之間的通信問(wèn)題由共享存儲(chǔ)的方式解決。系統(tǒng)結(jié)構(gòu)如圖2所示;
圖2 軟硬件協(xié)同動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)結(jié)構(gòu)圖
加載器負(fù)責(zé)源機(jī)器程序映像的加載工作。主要工作包括可執(zhí)行文件各個(gè)段的提取,并映射程序段和代碼段到進(jìn)程地址空間。加載成功后,源機(jī)器程序的數(shù)據(jù)以及運(yùn)行時(shí)所需要的棧和堆空間,將位于 Loader進(jìn)程地址空間的適當(dāng)位置,如圖3所示。整個(gè)目標(biāo)處理器的代碼都在Loader的進(jìn)程地址空間執(zhí)行。
圖3 系統(tǒng)運(yùn)行時(shí)地址空間布局
Loader得到代碼段的入口地址后(SPC),就跳轉(zhuǎn)到Stub Code,以SPC查找TPC,如果命中就跳轉(zhuǎn)到TPC處執(zhí)行,不命中則循環(huán)檢測(cè),這時(shí)會(huì)啟動(dòng)二進(jìn)制翻譯器翻譯該基本塊。這樣避免了運(yùn)行和翻譯環(huán)境的切換(context switch)。這種查找并不是每次必須的,當(dāng)實(shí)現(xiàn)了基本塊的鏈接之后,就不必跳轉(zhuǎn)到Stub Code查找,而是直接跳轉(zhuǎn)到下一個(gè)基本塊去執(zhí)行。
動(dòng)態(tài)二進(jìn)制翻譯是進(jìn)程級(jí)的應(yīng)用程序依附于操作系統(tǒng)之上。執(zhí)行引擎指揮翻譯與執(zhí)行構(gòu)成中所有的工作。虛擬機(jī)IP核的驅(qū)動(dòng)程序主要工作是負(fù)責(zé)主處理器和二進(jìn)制翻譯單元的通信與同步,包括源機(jī)器代碼的加載和目標(biāo)代碼的拷貝、中斷異常處理等。在軟硬件的同步與通信上,我們采用共享存儲(chǔ)的方式。同時(shí),為避免執(zhí)行單元與翻譯單元對(duì)存儲(chǔ)代碼的讀寫沖突,在系統(tǒng)結(jié)構(gòu)里增加了快速查詢表。該查詢表以基本塊地址指針和是否被翻譯的標(biāo)識(shí)符為查詢信息元,避免軟硬件對(duì)存儲(chǔ)代碼的讀寫沖突。為了更加快速和方便的訪問(wèn)硬件翻譯單元的內(nèi)存空間,采用內(nèi)存映射的方法,將翻譯器的物理地址映射,到操作系統(tǒng)的一段虛擬地址空間,這樣就可以直接訪問(wèn)硬件單元的寄存器。
硬件翻譯單元主要具備動(dòng)態(tài)二進(jìn)制翻譯和TCache管理功能。由于本設(shè)計(jì)向前兼容的是x86體系結(jié)構(gòu),x86指令集是典型的CISC架構(gòu)。其指令不僅種類繁多,而且編碼格式復(fù)雜,指令長(zhǎng)度變化很大,所以二進(jìn)制翻譯單元采用狀態(tài)機(jī)的設(shè)計(jì)??傮w狀態(tài)轉(zhuǎn)換圖如圖4所示。
Wait狀態(tài):系統(tǒng)reset后或者一個(gè)基本塊翻譯結(jié)束后進(jìn)入的狀態(tài),根據(jù)must_translate標(biāo)志判斷是否進(jìn)入開(kāi)始翻譯基本塊階段。
Start狀態(tài):判斷指令是否存在前綴,是單字節(jié)操作碼指令還是雙字節(jié)操作碼指令。
Opcode1狀態(tài):?jiǎn)巫止?jié)操作碼指令根據(jù)指令碼可能進(jìn)入譯碼狀態(tài)(如操作數(shù)都是寄存器的指令)、取立即數(shù)狀態(tài)、MOD_RM狀態(tài)。
Opcode2狀態(tài):和opcode1的狀態(tài)轉(zhuǎn)換類似。
Imm狀態(tài):對(duì)于存在立即數(shù)的指令,需要生成PowerPC指令以裝載立即數(shù)進(jìn)臨時(shí)寄存器。
MOD_RM狀態(tài):根據(jù)尋址方式字段判斷是否是register方式,是否帶SIB,是否有immediate進(jìn)入decode狀態(tài)、SIB、Imm狀態(tài)。
SIB狀態(tài):比例變址基址域的地址計(jì)算。
Disp狀態(tài):帶偏移的地址處理。
Semantic decode: 語(yǔ)義譯碼階段,這時(shí)所有的操作數(shù)在寄存器中或者是立即數(shù)。根據(jù)操作碼語(yǔ)義進(jìn)行譯碼生成PowerPC指令。
Block_wrap: 一個(gè)基本塊的結(jié)束,主要進(jìn)行基本塊在Tcache中存放地址的計(jì)算,更新查看TPC映射表,下一個(gè)基本塊的地址等。
總的來(lái)說(shuō),指令翻譯分為兩個(gè)階段:尋址操作數(shù)翻譯階段和語(yǔ)義翻譯階段。第一個(gè)階段主要完成x86復(fù)雜的操作數(shù)尋址,將操作數(shù)放置于臨時(shí)寄存器中(圖4中的SIB,Disp,Imm狀態(tài))。第二個(gè)階段主要是指令本身的語(yǔ)義翻譯,這時(shí)所有的操作數(shù)都是寄存器或者立即數(shù)(圖4中的Semantic Decode狀態(tài))。
圖4 翻譯器狀態(tài)轉(zhuǎn)移圖
本文設(shè)計(jì)的基于軟硬件協(xié)同設(shè)計(jì)的動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng),成功實(shí)現(xiàn)了x86 ELF可執(zhí)行文件的加載、翻譯以及執(zhí)行。翻譯系統(tǒng)的源結(jié)構(gòu),為IA-32結(jié)構(gòu)的整數(shù)指令部分,目標(biāo)體系結(jié)構(gòu)為IBM PowerPC結(jié)構(gòu)。
在系統(tǒng)成功加入硬件支持后,我們對(duì)典型二進(jìn)制翻譯系統(tǒng)性能瓶頸部分,進(jìn)行了詳細(xì)分析與性能比較。測(cè)試程序?yàn)榈湫偷膞86可執(zhí)行文件,包含了計(jì)算,中斷和系統(tǒng)調(diào)用。
圖5 性能瓶頸部分對(duì)比評(píng)測(cè)
圖5表示的是進(jìn)程級(jí)虛擬機(jī)的原瓶頸部分和改進(jìn)后,軟硬件協(xié)同設(shè)計(jì)翻譯系統(tǒng)的性能比較。從表中數(shù)據(jù)可以發(fā)現(xiàn)硬件支持的動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng),TCache的查找時(shí)間和基本塊的翻譯時(shí)間,都得到很好的改善。同時(shí),程序基本塊命中和缺失情況下的軟硬件協(xié)同設(shè)計(jì)翻譯系統(tǒng)和基于軟件二進(jìn)制翻譯系統(tǒng)的執(zhí)行時(shí)間的比較,除了性能提高以外,前者在命中和缺失兩種情況下表現(xiàn)平穩(wěn),在缺失的情況下性能波動(dòng)不大,而基于軟件的二進(jìn)制翻譯系統(tǒng)的缺失懲罰比較大,影響程序的實(shí)時(shí)性和啟動(dòng)時(shí)間。
隨著技術(shù)的進(jìn)步,多機(jī)器人系統(tǒng)將更多地出現(xiàn)在人們的生活中,它們?cè)诟纳迫祟惞ぷ骱蜕畹耐瑫r(shí),由于自身平臺(tái)異構(gòu)性,也給開(kāi)發(fā)者帶來(lái)了兼容性方面的問(wèn)題。本文討論了一種基于軟硬件協(xié)同設(shè)計(jì)的動(dòng)態(tài)二進(jìn)制翻譯的設(shè)計(jì)與實(shí)現(xiàn),提出了通過(guò)硬件加速技術(shù)來(lái)消除性能瓶頸。實(shí)驗(yàn)數(shù)據(jù)表明,硬件支持單元的集成,有效地改善了二進(jìn)制翻譯的性能。將其用于多機(jī)器人系統(tǒng),可以高效使用現(xiàn)有代碼,減少移植和新開(kāi)發(fā)帶來(lái)的工作量。
[1] 譚民,范永,徐國(guó)華.多機(jī)器人群體協(xié)作與控制的研究[J] .機(jī)器人, 2001,(2):178-182.
[2] Bao Yuncheng. Building Process Virtual Machine via Dynamic Binary Translation [D] . Shanghai Jiao Tong University, 2006.
[3] Baker A J, Kent K B. Design & Implementation of the Interface of a Hardware/Software Co-Designed Virtual Machine. [C] //PACRIM 2007: 109-112.
[4] Mishra C, Volkovs M.ConEx: a system for monitoring queries[C] // SIGMOD Conference 2007: 1076-1078.