處理器的體系結構


  今天我們來聊一下處理器的體系結構,理解處理器是如何工作的,能夠幫助我們理解整個計算機系統的工作原理。我們研究一個硬件系統是如何執行某種ISA(處理器支持的指令和指令的字節型編碼稱為處理器的指令集體系結構,Instruction-Set Architecture)指令的。

  我們自己定義一個簡單的指令集,然后基於指令集設計一個處理器。我們設計出的處理器是基於順序操作的,每個時鍾周期處理一條完整的指令,雖然不實用,但是對於我們理解處理器的體系結構已經足夠了!

 

  一.  指令集體系結構

  我們自己定義一個指令體系結構,包括可見狀態,指令集,指令編碼以及異常事件處理。

  1.可見狀態

  可以通過指令集中的指令讀取或者修改的處理器的狀態,稱為可見狀態。這里的可見指的是對寫匯編代碼的人和產生機器代碼的編譯器可見。

  8個程序寄存器,每個程序寄存器存儲一個字;

  條件碼(CC),ZF,CF和OF,它們保存最近的算術和邏輯指令所造成的影響的有關信息;

  程序計數器(PC)存放當前正在執行的指令的地址;

  存儲器保存程序和數據;狀態碼(Stat)表明程序執行的總體狀態,表明是正常運行,還是出現了異常。

 

  2.指令集

  我們給出了指令集中各個指令的簡單描述,后面我們將要用處理器來實現這些指令。

  4個數據傳送指令:irmovl、rrmovl、mrmovl、rmmovl。指明了源操作數和目的操作數,源操作數可以是立即數、寄存器和存儲器;目的操作數可以是寄存器和存儲器。

  4個整數操作指令:addl、subl、andl、xorl。這些指令對寄存器數據進行操作,會對條件碼進行設置;

  7個跳轉指令:jmp、jle、jl、je、jne、jge、jg。根據分支指令的的類型和條件碼來選擇分支;

  6個條件傳送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg。當條件碼滿足約束時,更新目的寄存器的值;

  此外,call指令將返回的地址入棧,然后跳轉到目的地址,call 指令調用一個過程,指揮處理器從新的內存地址開始執行;過程使用 ret(從過程返回)指令將處理器轉回到該過程被調用的程序點上;pushl和popl指令實現入棧和出棧;halt指令停止指令的執行;nop為空指令。

  

  3.指令編碼

  如圖給出了指令的字節編碼,每條指令需要用1~6個字節編碼。

 

  如圖所示,每個格子表示一個四位的二進制數,兩個格子表示一個字節,圖中的數值為十六進制的數。

  每條指令含有一個字節大小的指令指示符(icode,ifun),其中,每條指令的第一個字節表示指令的類型,高四位(代碼值-icode)是代碼部分,低四位(功能值-ifun)是功能部分。當一組指令共用一個代碼(代碼值相同)時,功能值才起作用。

  部分指令含有一個字節大小的寄存器指示符(A,B,F),用於指定一個或兩個寄存器,對於只需要一個寄存器操作數的指令,將另一個寄存器的指示符設為0xF。8個寄存器都有相應的0~7的標識符(ID),當ID=0xF時,表示,沒有寄存器操作數。

  還有一部分指令含有四個字節的常數(valC),該常數可以作為立即數數據(V),地址指示符的偏移量(D)和目的地址(Dest)。

 

  4.異常事件處理

  當Stat的值分別為1、2、3和4時,分別對應AOK(正常操作)、HLT(處理器執行halt指令)、ADR(遇到非法地址)和INS(遇到非法指令)。

  當我們遇到上述異常時,就讓處理器停止執行指令,而在實際過程中,處理器會調用一個異常處理程序。

 

  二. 數字硬件設計

  邏輯門是數字電路的基本組成部分,包括與門,或門和非門。將邏輯門組合成一個網,稱為組合電路(如多路復用器MUX,算術\邏輯單元ALU等)。組合電路只是簡單的響應輸入信號,產生相應的輸出,不存儲任何信息。時序電路,是由最基本的邏輯門電路加上反饋邏輯回路(輸出到輸入)或器件組合而成的電路,與組合電路最本質的區別在於時序電路具有記憶功能。

  為了產生時序電路,需引入按位存儲信息的設備,存儲器由同一個時鍾控制,決定什么時候將新的值加載到設備中。為此,我們需要考慮以下兩種存儲設備:時鍾寄存器(寄存器)和隨機訪問存儲器(存儲器)。

  寄存器有兩個讀端口和一個寫端口。其中,val1和val2分別為寄存器的兩個讀端口RA和RB的數據輸出(數據輸出值),scrA和scrB分別為寄存器兩個讀端口RA和RB的地址輸入(表明選擇哪一個程序寄存器);valW和dstW分別為寄存器寫端口的數據輸入(程序寄存器的寫入值)和地址輸入。write、read和Clock分別為存儲器的讀寫控制信號和時鍾輸入信號,address和data_in分別為存儲器的地址輸入和數據輸入,data_out為存儲器的數據輸出。

 

  三. 設計處理器

  我們以一個簡單的SEQ處理器為例,在每個時鍾周期上,SEQ執行處理一條完整的指令所需的所有步驟,也就是說,一個時鍾周期處理一條指令,這需要很長的時鍾周期,效率極低。不過,在掌握了SEQ的基本原理的基礎上,我們可以實現一個高效的、流水線化的處理器。有興趣的朋友可以參考《深入理解計算機系統》第二版4.4,4.5節。

 

  我們將處理一條指令組織成以下6個階段,可以參考上圖進行理解。

  1.取指:將程序計數器(PC)的值作為地址,從存儲器中讀取指令字節icode、ifun、A、B和valC;同時PC增加器計算當前指令的下一條指令的地址valP(等於PC的值加上已經取出的指令的長度)

  2.譯碼:根據A和B字段指明的寄存器,讀取相應寄存器的值valA和valB。

  3.執行:對於整數操作,算術\邏輯單元(ALU)根據ifun的值,執行指令指明的操作,計算存儲器的有效地址;對於其他指令,算術\邏輯單元(ALU)增加或減小棧指針。最終得到值valW。同時,也可能會設置條件碼(CC)。

  4.訪存:將數據寫入存儲器或者從存儲器中讀出數據。讀出的值為valW。

  5.寫回:將算術\邏輯單元(ALU)計算出來的值和從數據存儲器中讀出來的值寫入寄存器

  6.更新:將程序計數器的值設置為下一條指令的地址。

 

  可以看到,我們將執行不同的指令所需要的步驟,組織成一個統一的流程,然后用各種硬件單元和時鍾信號來控制計算順序,從而實現整個處理器。

  

相關鏈接:

  虛擬存儲器 https://www.cnblogs.com/yongjin-hou/p/13543320.html
  存儲器的層次結構與程序的性能 https://www.cnblogs.com/yongjin-hou/p/13529924.html

 

參考書籍:Randal E.Bryant  David R.O'Hallaron 著,龔奕利  雷迎春 譯,《深入理解計算機系統》,機械工業出版社

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM