基于FPGA的M2M異構(gòu)虛擬化系統(tǒng)(二)
exe_mem_reg
本文引用地址:http://cafeforensic.com/article/201808/388222.htm本模塊完成EXE和MEM兩個(gè)階段之間的信號(hào)流水。本模塊的時(shí)序圖如下。
圖 22 exe_mem_reg時(shí)序圖
mem_stage
本模塊完成對數(shù)據(jù)Cache的讀寫。模塊的對外接口符合Wishbone總線標(biāo)準(zhǔn)。本模塊的主要時(shí)序如下圖。
圖 23 mem_stage時(shí)序圖
mem_wb_reg
本模塊完成MEM和WB兩個(gè)階段之間的信號(hào)流水。本模塊的時(shí)序圖如下。
圖 24 mem_wb_reg時(shí)序圖
wb_stage
本模塊完成寫回指令的寄存器堆修改操作。本模塊的時(shí)序圖如下。
圖 25 wb_stage時(shí)序圖
except
本模塊完成流水線中的中斷及異常處理。為了完成精確中斷,即產(chǎn)生異常的指令前已經(jīng)在流水線中的指令完成執(zhí)行,而在異常指令后的指令不允許完成執(zhí)行(不修改CPU狀態(tài)),才能響應(yīng)異常。因此,在實(shí)現(xiàn)精確中斷時(shí),需要對流水線中的指令進(jìn)行跟蹤,所有的異常或中斷信號(hào)將延遲到流水線的特定階段(Writeback)進(jìn)行響應(yīng),并且對不同類型的異常信號(hào),中斷程序的返回地址不同。本模塊的主要時(shí)序圖如下。
圖 26 except時(shí)序圖
4.1.2.2Cache模塊詳細(xì)設(shè)計(jì)方案
功能描述
本模塊實(shí)現(xiàn)指令Cache和數(shù)據(jù)Cache。其中,指令Cache和數(shù)據(jù)Cache的映射策略都采用直接映射方式。指令Cache只讀,數(shù)據(jù)Cache的寫策略為寫通過(主存和Cache里的數(shù)據(jù)時(shí)鐘保持一致)。
- 子模塊列表
Instruction Cache top | |
Data Cache top |
詳細(xì)設(shè)計(jì)
ic_top
本模塊的時(shí)序圖如下。
圖 27 ic_top時(shí)序圖
4.1.2.3動(dòng)態(tài)翻譯硬件模塊詳細(xì)設(shè)計(jì)方案
功能描述
為了提高動(dòng)態(tài)翻譯效率,我們在CPU中增加了硬件加速模塊。動(dòng)態(tài)翻譯硬件加速包括以下部分:
在QS-I CPU的ALU模塊中增加x86 flag寄存器(MIPS架構(gòu)中沒有flag標(biāo)志寄存器),軟件可通過mtc0,mfc0兩條指令來訪問flag寄存器。這樣x86的算術(shù)邏輯或比較指令(如add, sub, cmp等),以及條件跳轉(zhuǎn)指令(如ja, jb, jg等)有效地得到了硬件支持,使得軟件的翻譯效率大大提高。
在QS-I CPU外增加了JLUT(Jump address Lookup Table),即跳轉(zhuǎn)地址查表。通過CAM(Content Address Memory)的硬件支持,跳轉(zhuǎn)指令的翻譯效率將比完全基于軟件的翻譯方式提高一個(gè)數(shù)量級。在QS-I中將新增4條用戶指令campi, ramri, camwi, camwi用于軟件對JLUT的訪問。
- 子模塊列表
JLUT top | ||
SPC is stored in CAMs, and it will take less than two clock cycles to get address of the CAMs content specified. | ||
TPC is stored in ubiquitous RAMs. |
詳細(xì)設(shè)計(jì)
如下方的JLUT詳細(xì)設(shè)計(jì)圖所示,JLUT模塊與QS-I CPU之間通過campi, camwi, ramwi, ramwi四條指令進(jìn)行交互。
campi用于CAM的查表,camwi用于CAM的寫操作,ramwi用于RAM的寫操作,RAMRI用于RAM的讀操作。
4條指令的格式如下。
Instruction | Format | Usage |
campi | opcode, rs, 5’h0, rd, 5’h0, func | campi rd, rs |
camwi | opcode, rs, rt, 5’h0, 5’h0, func | camwi rt, rs |
ramwi | opcode, rs, rt, 5’h0, 5’h0, func | ramwi rt, rs |
ramri | opcode, rs, 5’h0, rd, 5’h0, func | ramri rd, rs |
圖 28 JLUT詳細(xì)設(shè)計(jì)圖
4.2.動(dòng)態(tài)翻譯詳細(xì)設(shè)計(jì)方案
二進(jìn)制翻譯技術(shù)能夠把一種體系結(jié)構(gòu)的二進(jìn)制程序翻譯成另一種體系結(jié)構(gòu)的二進(jìn)制程序,以在新的體系結(jié)構(gòu)下運(yùn)行。二進(jìn)制翻譯主要有三類:解釋執(zhí)行、靜態(tài)翻譯及動(dòng)態(tài)翻譯。
在系統(tǒng)總體框架圖中,二進(jìn)制翻譯層可運(yùn)行不同的翻譯程序,以在不同的體系之間進(jìn)行轉(zhuǎn)換,如x86到MIPS、ARM到MIPS、x86到ARM等。本部分挑選了8086到MIPS的動(dòng)態(tài)翻譯作為實(shí)現(xiàn)原型。
4.2.1.二進(jìn)制翻譯介紹
二進(jìn)制翻譯可以分為三大類:解釋執(zhí)行、靜態(tài)翻譯和動(dòng)態(tài)翻譯。
解釋執(zhí)行的流程是:取指、解析、執(zhí)行。它對源機(jī)器代碼進(jìn)行實(shí)時(shí)解釋并執(zhí)行,然后繼續(xù)下一條指令。系統(tǒng)不對已解釋的指令進(jìn)行保存或緩存。在這個(gè)框架下,不能對代碼進(jìn)行優(yōu)化。這種翻譯技術(shù)能取得高度兼容性,但執(zhí)行效率很低。
靜態(tài)翻譯是先將源可執(zhí)行文件轉(zhuǎn)換成目標(biāo)機(jī)器可執(zhí)行文件,然后運(yùn)行在目標(biāo)機(jī)器上。這是離線翻譯,因此有充足的時(shí)間對代碼進(jìn)行優(yōu)化,以提高代碼的執(zhí)行效率。但靜態(tài)翻譯很難做到正確性,如代碼的自修改問題,執(zhí)行過程中有些跳轉(zhuǎn)值只能在運(yùn)行時(shí)才能獲知等問題。
解釋執(zhí)行是實(shí)時(shí)翻譯,靜態(tài)翻譯是離線翻譯,動(dòng)態(tài)翻譯就像是兩者的折中。它不像解釋執(zhí)行那樣對每條指令進(jìn)行翻譯并馬上執(zhí)行,也不像靜態(tài)翻譯那樣將指令完全翻譯好之后才執(zhí)行。它每次對一個(gè)基本塊進(jìn)行翻譯并執(zhí)行,然后取另一個(gè)塊。一個(gè)基本塊一般包含多條算術(shù)類型指令,最后是一條控制流(Control Flow)類型指令。已翻譯的塊可進(jìn)行緩存或保存。動(dòng)態(tài)翻譯只對將要執(zhí)行的代碼進(jìn)行翻譯,且能很好地解決代碼自修改問題。
4.2.2.二進(jìn)制翻譯策略選擇
本項(xiàng)目采取的是軟硬協(xié)同動(dòng)態(tài)翻譯策略,將源二進(jìn)制代碼進(jìn)行翻譯,當(dāng)遇到控制流類型指令,如跳轉(zhuǎn)指令,系統(tǒng)調(diào)用等,翻譯過程掛起,將已翻譯的指令序列作為一個(gè)基本塊,然后運(yùn)行基本塊。當(dāng)基本塊執(zhí)行完以后,會(huì)跳到下一處執(zhí)行。若下一處已翻譯過,則繼續(xù)執(zhí)行,否則暫停執(zhí)行以進(jìn)行翻譯,如此過程循環(huán)。完整的流程如下圖所示。
圖 29 x86程序翻譯執(zhí)行流程
基本塊執(zhí)行時(shí)有硬件模塊輔助,如圖 12所示。硬件模塊管理跳轉(zhuǎn)緩存,緩存的基本項(xiàng)為對。程序執(zhí)行到跳轉(zhuǎn)指令時(shí),程序向跳轉(zhuǎn)緩存發(fā)送SPC,得到相應(yīng)的TPC,再跳至TPC繼續(xù)執(zhí)行生成塊。簡單的示例如圖 30所示。源程序從塊A開始執(zhí)行,到末尾時(shí),需要跳轉(zhuǎn)到塊C。翻譯后執(zhí)行,執(zhí)行完塊A’后將要跳轉(zhuǎn),此時(shí)的跳轉(zhuǎn)地址是SMEM中地址,即SPC,要轉(zhuǎn)換成相應(yīng)的TPC,該TPC就由跳轉(zhuǎn)緩存中尋找。
圖 30 SMEM與TMEM的映射
4.2.3.8086程序的載入
首先,由系統(tǒng)向服務(wù)器發(fā)送命令,命令格式為x86 *.com,它包含在自定義傳輸協(xié)議中,類型碼為86,要求.com文件僅使用一個(gè)段,大小限制為64KB。服務(wù)器找到所指定的文件,并將其傳送給系統(tǒng),系統(tǒng)將其存放在內(nèi)存中。至此,完成8086可執(zhí)行程序的載入。
4.2.4.標(biāo)志寄存器處理
8086中有個(gè)標(biāo)志寄存器FLAGS,而MIPS中沒有與之相對應(yīng)的標(biāo)志寄存器,解決辦法有二,軟件模擬實(shí)現(xiàn)或硬件提供支持。
軟件模擬指的是,當(dāng)一條8086指令執(zhí)行后,會(huì)影響哪些標(biāo)志位,然后用軟件方法將其模擬出來,使兩者的結(jié)果一致。如執(zhí)行add ax, bx對溢出位的影響。模擬時(shí),將ax移到MIPS的$t0寄存器的低16位,將bx移到MIPS的$t1寄存器的低16位,然后對$t0和$t1做加法,結(jié)果放到$t0,相對應(yīng)的指令為add $t0, $t0, $t1。結(jié)果是否溢出則要查看$t0的第16位。最后,還要將溢出位存放至標(biāo)志寄存器的對應(yīng)位。這中間還要涉及移位運(yùn)算、位運(yùn)算等,所需代價(jià)很大,但有個(gè)好處是無需對硬件平臺(tái)做改動(dòng),使硬件平臺(tái)更為純粹。
若采用提供硬件支持,那么硬件平臺(tái)需稍做修改,增加一個(gè)類FLAGS寄存器。仍以上面的add ax, bx為例。將ax、bx分別放到$t0、$t1的高16位,然后進(jìn)行相加,是否溢出的結(jié)果會(huì)自動(dòng)保存到新添加的類FLAGS寄存器里,因而軟件層面無需再做處理。此種做法,增加了硬件工作,但大大簡化了軟件的操作。8086的FLAGS有多個(gè)標(biāo)志位,若要完全實(shí)現(xiàn),那么對本身的硬件平臺(tái)改動(dòng)會(huì)比較大,因此,我們只選擇了其中幾個(gè)進(jìn)行實(shí)現(xiàn),如Z、O、C、S等。
4.2.5.寄存器映射
MIPS有32個(gè)通用寄存器,從0號(hào)到31號(hào),每個(gè)寄存器為32位。8086的通用寄存器有8個(gè):AX、CX、DX、BX、SP、BP、SI和DI。這8個(gè)通用寄存器都是16位,AX、CX、DX和BX還可以分成兩個(gè)8位寄存器,高8位和低8位,如AX可分為AH和AL。此外,段寄存器有CS、DS、ES和SS,都是16位。還有IP寄存器和FLAGS寄存器,也都是16位。
因?yàn)镸IPS的寄存器數(shù)量比8086的寄存器多,可以采用直接映射,一個(gè)8086寄存器對應(yīng)一個(gè)MIPS寄存器,而不需要對寄存器進(jìn)行置換,簡化了寄存器的管理。
評論