基于X86平臺的ARM指令集模擬器的設計
2.2 ARM指令集模擬器的流程設計
本模擬器是按照解釋型模擬器的模擬策略設計的。解釋型指令集模擬器基本上是以軟件實現的虛擬機,它以解釋的形式在宿主機上執行加載的目標代碼,它的主體是一個具有3步過程的循環體,分別對應取指令、指令譯碼、指令執行3步操作。因此本ARM指令集模擬器的核心流程就是加載程序,之后進入讀取指令、指令譯碼和指令執行的循環體中,當所有目標代碼都執行之后結束并顯示運行結果。整個流程如圖4指令模擬器的工作流程所示。本文引用地址:http://www.104case.com/article/201610/306034.htm
2.3 ARM指令集模擬器的主要功能模塊設計
2.3.1 指令譯碼模塊
指令譯碼模塊的功能就是根據ARM指令集編碼,將要執行的二進制指令譯碼成操作碼、操作數、條件碼等指令模擬需要的信息。指令集模擬器的每一模擬步模擬一條指令的取指令、譯碼、執行等各個階段,因此指令集模擬器中的指令譯碼與實際ARM處理器的譯碼并不是完全對應,同時也不會影響模擬的正確性。
在指令譯碼模塊中,本文采用分類的思想,將指令集按照一定的規律進行分類解析,逐步解析,找到最終指令所對應的解析函數。這樣做的目的是為了減少判斷指令時的條件判斷次數,采用分治的思想提高指令譯碼的效率。不過要想對指令譯碼效率有顯著性的提高,還是要采用改進型的工作流程,主要原因是在指令譯碼的過程中,會出現大量的重復譯碼,所以改進型的工作流程中提出的指令緩存技術會很好的提高譯碼效率,減少重復的譯碼工作。
2.3.2 指令模擬與調度模塊
指令模擬與調度功能模塊是指令集模擬器的核心部分,也是實現代碼量最大的部分,主要包括與虛擬指令集定義對應的一系列指令模擬函數、指令執行控制函數、指令翻譯調度函數、中斷處理函數以及一些公用函數。指令執行控制函數負責控制整個模擬過程,反匯編結果文件加載完畢后,程序就進入核心部分的模擬循環;指令翻譯調度函數負責將目標指令轉化為虛擬指令形式,然后指令模擬函數按照相應指令的功能定義完成指令的模擬,模擬結果是修改存儲器、寄存器值:公用函數主要包括尋址方式判別、指令操作數分析、指令條件碼判別、移位操作、ALU操作以及寄存器訪問等。指令模擬與調度的循環過程如下:
1)取指令
該模擬器的輸入是二進制可執行文件,因此取指令時,根據PC值取得的當前的指令,進行譯碼。
2)翻譯
調用指令翻譯函數獲得虛擬指令。
3)調度
根據指令類型,調用相應的指令模擬函數。
4)執行
指令模擬函數對指令進行模擬。
5)中斷檢測與調度
為了對中斷系統進行模擬,本文定義了對應于FIQ、IRQ的標志變量,可以改變他們來模擬外部中斷輸入,每條指令模擬結束后,必須檢測上述兩個標志,如果檢測到中斷發生,則調用相應的異常進入函數,PC被設定為中斷服務程序入口地址。
6)更新PC值
如果本次循環沒有發生指令跳轉、加載PC及中斷,PC順序移向下一條指令。
評論