本發(fā)明屬于計算機軟件開發(fā),具體涉及一種基于訪存指令重構的跨內存頁差異兼容運行方法。
背景技術:
1、內存頁(memory?page)是計算機操作系統(tǒng)中用于管理內存的一種機制,它將物理內存劃分為固定大小的塊,每個塊稱為一個內存頁。內存頁的大小取決于操作系統(tǒng)的設計和硬件架構,常見的內存頁大小有4k、16k、2mb、1gb等。在內存頁大小為4k的操作系統(tǒng)中,內存分配和地址映射等操作是以?4k?為單位進行的;而在內存頁大小為16k的操作系統(tǒng)中,則是以?16k?為單位??蓤?zhí)行文件在運行時可能會涉及到內存分配、加載庫文件及動態(tài)內存管理等操作,這些操作在不同內存頁大小的操作系統(tǒng)中可能會受到影響。具體來說,當可執(zhí)行文件在內存頁大小為4k的操作系統(tǒng)中編譯時,編譯器和鏈接器會基于?4k?內存頁的假設來生成代碼和數(shù)據(jù)布局。例如,代碼中的指針偏移量、內存對齊方式等可能是按照?4k?內存頁的粒度來設置。
2、然而,當可執(zhí)行文件需要在與其編譯所在操作系統(tǒng)具有不同內存頁大小的目標操作系統(tǒng)中執(zhí)行時,則可能會因為內存頁大小的不同導致執(zhí)行異常。通常情況下,現(xiàn)有最佳解決方案是在內存頁大小為16k的目標操作系統(tǒng)上重新編譯該可執(zhí)行文件,這樣編譯器和鏈接器則可以根據(jù)目標操作系統(tǒng)的內存頁特性進行優(yōu)化,確保程序能夠充分利用目標操作系統(tǒng)的內存管理機制,但是這種方法要求具有該可執(zhí)行文件的完整源代碼,而這在很多情況下是難以實現(xiàn)的。
技術實現(xiàn)思路
1、有鑒于此,本發(fā)明提供了一種基于訪存指令重構的跨內存頁差異兼容運行方法,在無源代碼的前提下實現(xiàn)了可執(zhí)行文件在具有內存頁差異的系統(tǒng)中兼容運行。
2、本發(fā)明提供的一種基于訪存指令重構的跨內存頁差異兼容運行方法,具體包括以下步驟:
3、步驟1、將源系統(tǒng)編譯得到的可執(zhí)行文件在目標系統(tǒng)執(zhí)行,源系統(tǒng)的第一內存頁大小與目標系統(tǒng)的第二內存頁大小不同;
4、步驟2、對可執(zhí)行文件進行動態(tài)指令轉換,將各基本塊中的內存訪問指令記為目標指令,提取目標指令參數(shù)中的地址偏移量記為第一地址偏移量,若第一地址偏移量的類型為立即數(shù)則執(zhí)行步驟3,若第一地址偏移量的類型為寄存器則獲取寄存器的名稱記為目標寄存器執(zhí)行步驟5;
5、步驟3、對于能被第一內存頁大小整除的第一地址偏移量,將其的2n倍作為中間地址偏移量,若中間地址偏移量的長度超過了目標指令的參數(shù)長度限制則執(zhí)行步驟4;否則執(zhí)行步驟6;
6、步驟4、若存在與目標指令具有相同語義且支持的參數(shù)長度不小于中間地址偏移量長度的指令,則將中間地址偏移量作為第二地址偏移量,采用該指令和第二地址偏移量替換目標指令和第一地址偏移量,執(zhí)行步驟6;否則采用由保存指令和間接尋址指令構成的第一指令組合替換目標指令,執(zhí)行步驟6;
7、步驟5、從目標指令處開始反向反編譯到第一個修改目標寄存器的指令,將該指令記為第一指令,若第一指令位于循環(huán)體內則將循環(huán)體的結束指令作為標記指令,否則將第一指令作為標記指令;在標記指令后插入寄存器值修復函數(shù)的調用指令,其中,寄存器值修復函數(shù)以目標寄存器為輸入?yún)?shù),讀取目標寄存器內的數(shù)值,當該數(shù)值為基于第一內存頁大小對齊時將該數(shù)值轉換為基于第二內存頁大小對齊;
8、步驟6、完成可執(zhí)行文件內所有內存訪問指令的轉換得到能夠在目標系統(tǒng)運行的目標代碼。
9、進一步地,所述第一內存頁大小為4k。
10、進一步地,所述的跨內存頁差異兼容運行方法還包括:
11、步驟3.1在所述目標代碼的執(zhí)行入口處注冊第一異常處理函數(shù),當目標代碼執(zhí)行過程中產生內存對齊異常時,將產生異常的指令記為異常指令,將該指令的地址偏移量記為異常地址偏移量,第一異常處理函數(shù)將異常地址偏移量的2n倍作為修復地址偏移量,若修復地址偏移量的長度大于異常指令的參數(shù)長度限制則執(zhí)行步驟3.2;否則將異常地址偏移量轉換為修復地址偏移量,恢復異常后從異常地址偏移量處執(zhí)行;
12、步驟3.2、采用由保存指令和間接尋址指令構成的第二指令組合替換異常指令,當?shù)诙噶罱M合的長度大于異常指令的長度時執(zhí)行步驟3.3,等于時將第二指令組合寫入異常地址偏移量對應的地址處,小于時在第二指令組合之后增加?nop指令后寫入異常地址偏移量對應的地址處;恢復異常后從異常地址偏移量處執(zhí)行;
13、步驟3.3、建立目標指令緩存,目標指令緩存的長度為第二指令組合的長度與第一跳轉指令的長度之和,將第二指令組合及第一跳轉指令寫入目標指令緩存,第一跳轉指令的跳轉目標地址為異常地址偏移量與異常指令長度之和;若異常指令的長度不小于第二跳轉指令的長度則在異常地址偏移量處寫入第二跳轉指令及相應個?nop指令,第二跳轉指令的跳轉目標地址為目標指令緩存的地址,恢復異常后從目標指令緩存的地址處執(zhí)行;否則,直接恢復異常后從目標指令緩存的地址處執(zhí)行。
14、進一步地,建立異常指令與目標指令緩存的地址之間的映射關系,根據(jù)映射關系恢復異常后從目標指令緩存的地址處執(zhí)行。
15、進一步地,所述步驟4中所述第一指令組合由拆分中間地址偏移量所需的指令組成。
16、進一步地,所述第一指令組合由mov指令和orr指令組成。
17、有益效果
18、1、本發(fā)明通過修改目標系統(tǒng)的動態(tài)指令轉換引擎(dit)或動態(tài)二進制翻譯引擎,在執(zhí)行由源系統(tǒng)編譯生成的可執(zhí)行文件時,對于不滿足目標系統(tǒng)內存頁大小要求的內存訪問指令,在其轉換過程中通過修改地址偏移量參數(shù)或采用指令組合替換等方式重構訪存指令,在無源代碼的前提下實現(xiàn)了可執(zhí)行文件在具有內存頁差異的系統(tǒng)中兼容運行。
19、2、本發(fā)明在轉換得到的目標代碼中增加了內存訪問異常的處理機制實現(xiàn)了動態(tài)生成代碼的訪存指令重構,進一步提高了可執(zhí)行文件在具有內存頁差異的系統(tǒng)中兼容運行的可靠性。
1.一種基于訪存指令重構的跨內存頁差異兼容運行方法,其特征在于,具體包括以下步驟:
2.根據(jù)權利要求1所述的跨內存頁差異兼容運行方法,其特征在于,所述第一內存頁大小為4k。
3.根據(jù)權利要求1所述的跨內存頁差異兼容運行方法,其特征在于,所述的跨內存頁差異兼容運行方法還包括:
4.根據(jù)權利要求3所述的跨內存頁差異兼容運行方法,其特征在于,建立異常指令與目標指令緩存的地址之間的映射關系,根據(jù)映射關系恢復異常后從目標指令緩存的地址處執(zhí)行。
5.根據(jù)權利要求1所述的跨內存頁差異兼容運行方法,其特征在于,所述步驟4中所述第一指令組合由拆分中間地址偏移量所需的指令組成。
6.根據(jù)權利要求5所述的跨內存頁差異兼容運行方法,其特征在于,所述第一指令組合由mov指令和orr指令組成。