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