本發明涉及計算機應用領域,尤其涉及一種在動態二進制翻譯系統中處理間接轉移指令的方法和裝置。
背景技術:
動態二進制翻譯技術(dynamic translation)廣泛應用于指令系統模擬,二進制插樁,動態優化,程序行為分析等領域。在大多數應用場景下,性能是翻譯系統需考慮的重要指標。其中,控制轉移指令的處理方法是影響動態翻譯系統性能的重要因素。控制轉移指令一般可分為條件轉移,直接跳轉與間接轉移。對于轉移目標固定的條件轉移指令與直接跳轉指令,翻譯系統可使用代碼塊鏈接技術來降低開銷。
而間接轉移指令(IB:Indirect Branch)的轉移目標在運行時才可以確定,且轉移目標不固定,因此每次執行時均需進行一次源程序計數器地址(SPC:Source Program Counter address,簡稱源地址)到目標程序計數器地址(TPC:Target Program Counter address,簡稱目標地址)的地址轉換操作,導致了巨大的性能開銷,使得間接轉移指令的處理過程成為系統性能開銷的主要來源。
圖1為現有技術中動態翻譯系統處理間接轉移指令的流程示意圖。在獲取到轉移目標的源地址(SPC)時,翻譯系統會進入一個PC分發器(Dispatcher),將源地址轉換為目標地址(TPC)。翻譯系統一般會維護一個SPC-TPC的映射表,在源地址產生后,運行一個Hash查表例程來進行地址轉換,然后再跳轉至相應的目標地址。但進行一次Hash查表需要10條以上指令,導致較大的開銷。軟件預測法可以一定程度上避免Hash查表開銷,即在轉移目標的SPC產生后,進行若干次的比較-跳轉的預測操作,若預測成功則直接跳轉。但軟件預測法的預測準確率一般較低,制約了其對整體性能的提升。
此外,還出現了一些軟硬件協同的優化方案,如在CPU流水線中新增一個跳轉地址查找表,或者新增一個按內容訪問的相聯存儲器(CAM:content-associated memory),但這些方案均需改動硬件或指令系統,通用性較差,無法在已有平臺上實現。
在動態二進制翻譯系統中,當間接轉移指令的轉移目標產生時,如何實時進行一次源地址到目標地址的轉換需要提供一種新的技術方案。。
技術實現要素:
本發明提供一種在動態二進制翻譯系統中處理間接轉移指令的方法和系統,要解決的技術問題是如何提升動態二進制翻譯系統的性能。
為解決上述技術問題,本發明提供了一種在動態二進制翻譯系統中處理間接轉移指令的方法,包括:
保存用于在動態二進制翻譯系統中處理間接轉移指令的重定向表;
當接收到間接轉移指令時,根據間接轉移指令中的源地址在所保存的重定向表中查找該源地址對應的表項;所述重定向表以源地址為索引建立;
如果查找到的表項為空,則在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
如果查找到的表項中包含重定向信息,則執行所述重定向信息,將程序控制流重定向至相應的目標地址處。
可選地,所述重定向表復用源二進制代碼空間存儲,或單獨存儲在一塊與源二進制代碼空間具有一個固定偏移量的影子空間中;
所述在重定向表中查找該源地址對應的表項的步驟包括:
若重定向表存儲在源二進制代碼空間中,則直接查找所述源地址所代表的存儲位置中的表項;
若重定向表存儲在影子空間中,則在所述影子空間中,查找所述源地址加上所述的固定偏移量的結果所代表的存儲位置中的表項。
可選地,如果所述動態二進制翻譯系統的源平臺是變長指令系統平臺,則所述重定向表中的表項為鏈式表項,所述重定向信息為短跳轉指令;
如果所述動態二進制翻譯系統的源平臺是定長指令系統平臺,則所述重定向信息包括源地址相對應的目標地址。
可選地,所述的方法還包括:
當所述動態二進制翻譯系統啟動后,將源二進制代碼空間或影子空間的頁面標記為不可運行;當在頁面填入一個表項后,在該頁面其他位置填入軟件中斷指令;
所述如果查找到的表項為空,則在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息的步驟包括:
當頁面中不包含表項且空白表項被執行時,觸發頁面權限異常,調用頁面異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
當頁面已包含一個表項且空白表項被執行時,觸發軟件中斷異常,調用軟件中斷異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息。
本發明還提供了一種在動態二進制翻譯系統中處理間接轉移指令的裝置,包括:
存儲單元,用于保存用于在動態二進制翻譯系統中處理間接轉移指令的重定向表;
查找單元,用于當接收到間接轉移指令時,根據間接轉移指令中的源地址在所述存儲單元所保存的重定向表中查找該源地址對應的表項;所述重定向表以源地址為索引建立;
寫入單元,用于當查找到的表項為空時,在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
執行單元,用于當查找到的表項中包含重定向信息時,執行所述重定向信息,將程序控制流重定向至相應的目標地址處。
可選地,所述存儲單元復用源二進制代碼空間保存所述重定向表,或將所述重定向表單獨存儲在一塊與源二進制代碼空間具有一個固定偏移量的影子空間中;
所述查找單元在重定向表中查找該源地址對應的表項是指:
若重定向表存儲在源二進制代碼空間中,所述查找單元直接查找所述源地址所代表的存儲位置中的表項;若重定向表存儲在影子空間中,所述查找單元在所述影子空間中查找所述源地址加上所述固定偏移量的結果所代表的存儲位置中的表項。
可選地,如果所述動態二進制翻譯系統的源平臺是變長指令系統平臺,則所述重定向表中的表項為鏈式表項,所述重定向信息為短跳轉指令;
如果所述動態二進制翻譯系統的源平臺是定長指令系統平臺,則所述重定向信息包括源地址相對應的目標地址。
可選地,所述的裝置還包括:
按需構造單元,用于當所述動態二進制翻譯系統啟動后,將源二進制代碼空間或影子空間的頁面標記為不可運行;當在頁面填入一個表項后,在該頁面其他位置填入軟件中斷指令;
所述寫入單元當查找到的表項為空時,在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息是指:
所述寫入單元當頁面中不包含表項且空白表項被執行時,觸發頁面權限異常,調用頁面異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;當頁面已包含一個表項且空白表項被執行時,觸發軟件中斷異常,調用軟件中斷異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息。
與現有技術相比,本發明的至少一個實施例通過在動態二進制翻譯系統運行過程中實時建立一個重定向表來處理間接轉移指令,在處理間接轉移指令時無需對轉移目標進行地址轉換,可直接跳轉至源地址,再由該源地址對應的重定向信息將控制流定向至相應的目標地址,無需進行任何計算便可直接跳轉,避免了在處理該類指令時進行地址轉換操作;而且不需要新增硬件或改動指令系統,可用于絕大部分動態二進制翻譯系統中,以少量內存冗余為代價優化了間接轉移指令的處理過程,可大幅提升翻譯系統的整體性能。
本發明的又一個實施例采用兩層粒度的基于異常的按需構造方法建立所述重定向表,系統啟動時整個表為空白表,各個表項第一次被使用時填入重定向信息,采用基于異常機制的方法來保證空白表項不會被使用。本發明的又一個實施例復用源二進制代碼地址空間來建立重定向表,無需額外分配大量內存。本發明的又一個實施例使用影子空間(Shadow Space)的方法來保護被覆蓋的源二進制代碼,將重定向表存儲在影子空間中,使得系統在存在自修改代碼(Self-modifying Code)的情況下依然可以正確執行。本發明的又一個實施例使用在線剖析技術,僅對熱點指令進行優化,以減少內存占用。
附圖說明
圖1為現有技術中動態翻譯系統處理間接轉移指令的流程示意圖;
圖2為實施例一的在動態二進制翻譯系統中處理間接轉移指令的方法的流程示意圖;
圖3為實施例一的在動態二進制翻譯系統中處理間接轉移指令的方法中信號轉移的示意圖;
圖4a是實施例一在一種變長指令系統平臺(x86)上的實現示意圖;
圖4b是圖4a的實現方式中影子空間的跳轉示意圖;
圖5是實施例一在一種定長指令系統平臺(ARM)上的實現示意圖。
具體實施方式
為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖及具體實施例對本發明作進一步的詳細描述。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。
實施例一、一種在動態二進制翻譯系統中處理間接轉移指令的方法,如圖2所示,包括:
201、保存用于在動態二進制翻譯系統中處理間接轉移指令的重定向表;當接收到間接轉移指令時,根據間接轉移指令中的源地址在所保存的重定向表中查找該源地址對應的表項;所述重定向表以源地址為索引建立;
202、如果查找到的表項為空,則執行步驟203;如果查找到的表項中包含重定向信息,則執行步驟204;
203、在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
204、執行所述重定向信息,將程序控制流重定向至相應的目標地址處。
圖3為本實施例提供的在動態二進制翻譯系統中處理間接轉移指令的方法中信號轉移的示意圖。圖3所示信號流向包括:
在獲取到轉移目標的SPC后,無需進入PC分發器進行地址轉換,而直接跳轉至SPC。SPC地址處原本存儲的是源二進制指令,在經過表構造后,該地址成為一個重定向表表項,包含有一段重定向信息,可以但不限于為跳板代碼(Jump to$TPC),可將程序控制流重定向至相應的TPC處。
本實施例中,各個表項第一次被使用時填入重定向信息,隨著使用時間增加,表項中記錄的源地址以及該源地址對應的重定向信息也會增加;在所有表項均被填入后,重定向表進入穩定工作狀態,翻譯系統在遇到間接轉移指令時可直接跳轉至源地址,已預設好的表項會將程序控制流重定向至正確的目標地址。這樣使得翻譯系統在遇到間接轉移指令時,無需進行地址轉換操作,可直接跳轉至源地址,避免了在處理該類指令時進行地址轉換操作,在該機制的支持下,處理一次間接轉移所需的指令條數可從10條降為2~6條,從而大幅提升翻譯系統的整體性能。
本實施例的一種實施方式中,根據間接轉移指令中的源地址在所保存的重定向表中查找該源地址對應的表項之前還可以包括:
判斷接收到間接轉移指令是否為熱點間接轉移指令;所述熱點間接轉移指令是指執行次數達到預定閾值的間接轉移指令;
如果是,再對其使用重定向表技術。
本實施方式中,可以但不限于采用在線剖析技術確定熱點間接轉移指令,即在系統中加入一段剖析代碼,實時監測間接轉移指令的執行次數。剖析的目的是為了確定該間接轉移指令是否為熱點間接轉移指令。由于重定向表具有一定的“啟動開銷”,因此只有熱點間接轉移指令才會使用重定向表技術,多次執行后可將啟動開銷平攤至忽略不計。對于非熱點間接轉移指令,則可使用已有的其他處理方法。
本實施例的一種實施方式中,所述重定向表復用源二進制代碼空間,稀疏的分布在源二進制代碼空間中。
本實施方式復用源二進制代碼空間建立源地址索引的重定向表(Redirecting Table),不需要額外占用大量內存。
本實施例的一種實施方式中,在無法使用頁表機制保護被覆蓋的源二進制代碼時,所述重定向表單獨存儲在一塊與源二進制代碼空間具有一個固定偏移量的影子空間中;
本實施例的一種實施方式中,所述在重定向表中查找該源地址對應的表項的步驟包括:
若重定向表存儲在源二進制代碼空間中,則直接查找所述源地址所代表的存儲位置中的表項;
若重定向表存儲在影子空間中,則在所述影子空間中查找所述源地址加上所述固定偏移量的結果所代表的存儲位置中的表項。
本實施方式中,為保護被覆蓋的源二進制代碼,將所述重定向表存儲在影子空間中,使得系統在存在自修改代碼(Self-modifying Code)的情況下依然可以正確執行。
本實施例的一種實施方式中,所述的方法還可以包括:
當所述動態二進制翻譯系統啟動后,將源二進制代碼空間或影子空間的頁面標記為不可運行;當在頁面填入一個表項后,在該頁面其他位置填入軟件中斷指令;
所述如果查找到的表項為空,則在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息的步驟包括:
當頁面中不包含表項且空白表項被執行時,觸發頁面權限異常,調用頁面異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
當頁面已包含一個表項且空白表項被執行時,觸發軟件中斷異常,調用軟件中斷異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息。
本實施方式中,重定向表采用兩層粒度的基于異常(Exception)的按需(On Demand)構造方法。首先是頁面級粒度,翻譯系統在啟動后將整個源二進制地址空間的頁面標記為不可運行,當空白表項被執行時,會觸發一個頁面權限異常,異常處理函數將負責填入相應表項。然后是指令級粒度,在頁面已包含一個表項時,該頁面其他位置將被填入軟件中斷指令,當空白表項被執行時,會觸發一個軟件中斷異常,異常處理函數將負責填入相應表項。由此可以看出,所述表項采用兩層粒度基于異常進行構造,不需要離線分析過程,利用頁保護機制和軟件中斷指令來保證空白表項不會被執行。
本實施例的一種實施方式中,如果所述動態二進制翻譯系統的源平臺是變長指令系統平臺,則所述重定向表中的表項為鏈式表項,所述重定向信息為短跳轉指令;
如果所述動態二進制翻譯系統的源平臺是定長指令系統平臺,則所述重定向信息包括源地址相對應的目標地址。
圖4a是本實施例在一種變長指令系統平臺(x86)上的實現方式的示意圖,采用了影子空間放置所述重定向表。在源二進制指令太短,無法容納重定向表表項時,采用了一種鏈式表項(Entry Chain)的方法,如圖4b所示,可利用短跳轉指令將控制流重定向至合適的位置。
圖5是本實施例在一種定長指令系統平臺(ARM)上的變化版本的示意圖。在此變化版本中,重定向表表項不再存儲跳板代碼(Jump to$TPC),而是直接存儲TPC值,系統可直接讀取該表項獲取相應的目標地址。
實施例二、一種在動態二進制翻譯系統中處理間接轉移指令的裝置,包括:
存儲單元,用于保存用于在動態二進制翻譯系統中處理間接轉移指令的重定向表;
查找單元,用于當接收到間接轉移指令時,根據間接轉移指令中的源地址在所述存儲單元所保存的重定向表中查找該源地址對應的表項;所述重定向表以源地址為索引建立;
寫入單元,用于當查找到的表項為空時,在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;
執行單元,用于當查找到的表項中包含重定向信息時,執行所述重定向信息,將程序控制流重定向至相應的目標地址處。
本實施例的一種實施方式中,所述存儲單元可以復用源二進制代碼空間保存所述重定向表,將所述重定向表稀疏的分布在源二進制代碼空間中。
本實施例的一種實施方式中,在無法使用頁表機制保護被覆蓋的源二進制代碼時,所述存儲單元將所述重定向表單獨存儲在一塊與源二進制代碼空間具有一個固定偏移量的影子空間中;
本實施例的一種實施方式中,所述查找單元在重定向表中查找該源地址對應的表項具體可以是指:
若重定向表存儲在源二進制代碼空間中,所述查找單元直接查找所述源地址所代表的存儲位置中的表項;
若重定向表存儲在影子空間中,所述查找單元在所述影子空間中查找所述源地址加上所述固定偏移量的結果所代表的存儲位置中的表項。
本實施例的一種實施方式中,如果所述動態二進制翻譯系統的源平臺是變長指令系統平臺,則所述重定向表中的表項為鏈式表項,所述重定向信息為短跳轉指令;
如果所述動態二進制翻譯系統的源平臺是定長指令系統平臺,則所述重定向信息包括源地址相對應的目標地址。
本實施例的一種實施方式中,所述的裝置還可以包括:
按需構造單元,用于當所述動態二進制翻譯系統啟動后,將源二進制代碼空間或影子空間的頁面標記為不可運行;當在頁面填入一個表項后,在該頁面其他位置填入軟件中斷指令;
所述寫入單元當查找到的表項為空時,在該表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息具體可以是指:
所述寫入單元當頁面中不包含表項且空白表項被執行時,觸發頁面權限異常,調用頁面異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息;當頁面已包含一個表項且空白表項被執行時,觸發軟件中斷異常,調用軟件中斷異常處理函數在表項中填入將程序控制流重定向至所述源地址對應的目標地址處的重定向信息。
以上所述,僅為本發明的具體實施方式,但本發明的保護范圍并不局限于此,任何熟悉本技術領域的技術人員在本發明揭露的技術范圍內,可輕易想到變化或替換,都應涵蓋在本發明的保護范圍之內。因此,本發明的保護范圍應以權利要求所述的保護范圍為準。