標籤:語言 ref 串連 intel app 使用 訪問 ret 執行
前一章敘述了c語言如何轉化為組譯工具,如何使用組譯工具。但是,組譯工具具體是如何執行的呢?例如(add %eax %edx)這條指令,我們知道它的功能,處理器是何如執行指令來獲得想要的結果?——這是本章的主題。
(一)Y86指令集體繫結構
為了簡化問題,我們不使用Intel和ATT的指令集體繫結構,抽象簡化一個Y86。Y86的定義了各種狀態元素、指令集及其編碼、編程規範、例外狀況事件處理。
(二)儲存空間和時鐘
存放裝置都是由同一個時鐘控制的。時鐘是一個周期性的訊號,決定什麼時候把新值載入到裝置中。
存放裝置分兩種:
1)時鐘寄存器(硬體寄存器),儲存單個位或字,時鐘訊號控制寄存器載入輸入值;
2)隨機訪問儲存空間(儲存空間)儲存多個字,用地址來選擇該讀寫哪個字,包括:處理器的虛擬儲存系統、程式寄存器等。
(硬體和機器級編程,“寄存器”這一概念是有細微差距的。硬體中,寄存器是直接連接到電路中的;而機器級編程中,寄存器是寄存器檔案中可定址的字,地址為寄存器ID。為避免歧義,兩類寄存器分別稱為:硬體寄存器和程式寄存器。)
(圖為時鐘寄存器工作方式,Y86中用時鐘寄存器儲存程式計數器(PC)、條件代碼(CC)和程式狀態(Stat))
(三)指令執行6大階段
下面是Y86各個指令對應於6各階段的分解,可以對照上面的說明仔細對照
(四)SEQ處理器
我們直接實現上述的6大階段對應的硬體結構,稱為SEQ處理器
上面展示了每條指令所對應的分階段執行情況,現在我們把這些指令匯總,給出每個階段的指令情況:
(相應的need_regids, need_valC; srcB, dstM; aluB; mem_data, mem_write指令情況見課本)
(五)流水線
SEQ實現的問題是:一個刻度內,必須完成6大階段。故而刻度必須非常慢。所以我們使用流水線模型。
流水線的兩個重要概念:
throughput(輸送量):單位時間內服務的顧客總數;
延遲(latency):服務一個使用者所需要的時間。
流水線模型需要在各個階段之間都放上流水線寄存器。
下面是流水線的圖例說明:
可以看到流水線的巨大優點,然而流水線就沒有一點問題嗎?
1. 將系統計算劃分為一組具有相同延遲的階段是很嚴峻的挑戰;
2. 流水線過深的話,收益反而下降。(現在處理器採用很深的(15+階段)流水線,Y86採用5階段流水線)
3. 帶反饋的流水線。1)data dependency(資料相關):相鄰指令之間可能是相關的。流水線模式下,可能下一條指令需要的資料,上一條指令還沒產生。2)control dependency(控制相關):下一條指令是否執行依賴的條件,上一條指令還沒有計算出來。
當我們實現流水線結構時,我們要解決第三個問題。
(六)Y86的流水線實現——PIPE-
首先對於SEQ,我們將PC的計算挪到取指階段(在時鐘開始是計算,而不是結束時計算),然後再在各個階段之間加上流水線寄存器:
在PIPE-結構的基礎上,根據我們之前的學習,只要再解決幾個大問題即可:
1.如何解決資料相關?
2.如何解決控制相關?重點是ret指令和條件跳轉指令
3.如何處理異常指令?
解決資料相關:
需要仔細的體會這一過程,尤其是時鐘控制下,狀態更新如何進行。
解決控制相關:
這一問題分解來看,需要分三個部分:1.如何預測下一個PC值?2.如何處理ret指令?3.如何處理預測錯誤分支?
處理異常指令:
對於控制相關問題,還需要多做一些說明,如何多個控制問題組合在了一起,我們應該如何處理?這一問題留到最後作為補充、
(七)PIPE處理器實現
根據上面的討論,我們只要在PIPE-中加入上述問題的解決方案之後,就得到了我們想要的PIPE處理器。
1.實現轉寄。只需要添加幾個電路即可實現。
具體的PIPE的HCL描述,見課本。
2.實現暫停和取消指令
在此新型流水線寄存器的基礎上,很容易實現暫停某指令或者取消某指令,由此,我們就可以實現之前問題的解決方案。
(八)控制相關情況的組合
CSAPP(3):處理器如何執行指令