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