Intel組合語言程式設計學習-第二章 IA-32處理器體系結構-上

Thinker_0o0發表於2016-08-03

2章  IA-32處理器體系結構

2.1  基本概念

    本章以程式設計師的視角描述Intel IA-32處理器家族機器計算機系統,包括所有的Intel相容處理器,如AMD的速龍(Athlon)和皓龍(Opteron)處理器。組合語言是學習計算機如何執行的絕好工具,同時這也就要求讀者具備計算機硬體的相關知識。本章的目的就是科普相關知識。

2.1.1  微機的基本結構

  

      中央處理器(CPU,Central Processor Unit是進行所有計算和邏輯操作的地方,它包含了數量有限的稱為暫存器(register)的儲存單元,一個高頻時鐘(clock)、一個控制單元(CU ,Control Unit)和一個算術邏輯單元(ALU,Arithmetic Logic Unit)。

(1)時鐘用於CPU的內部操作和其他系統部件的同步。

(2)控制單元(CU)系統調執行機器指令各個步驟的次序。

(3)算術邏輯單元(ALU)執行加法和減法等算術運算,以及ANDORNOT等邏輯運算。

    CPU通過插入主機板插槽的引腳同計算機的其餘部分相連線,大部分引腳與資料匯流排,控制匯流排和地址匯流排相連線。

記憶體儲存單元是計算機程式執行時存放指令和資料的地方。記憶體儲存單元接受CPU的資料請求,從隨機訪問儲存器(RAM)中取出資料送至CPU,火把資料從CPU送回暫存器中。

匯流排(BUS)是一組用於在計算機各部分之間傳送資料的並行線。計算機的匯流排一般分為三組獨立的匯流排構成:資料總心啊、控制匯流排和地址匯流排。資料匯流排(data bus)在CPU和記憶體之間傳送指令和資料;控制匯流排(control bus)使用二進位制訊號同步連線到系統匯流排上的所有裝置的動作;如果當前被執行的指令要在CPU和記憶體之間傳輸資料,那麼地址匯流排上保持著指令和資料的地址。

時鐘:設計CPU和系統匯流排的內閣操作由一個內部時鐘同步,這個時鐘以固定的頻率產生脈衝。機器指令使用的最基本的時間單位成為機器週期或時鐘週期。

機器指令的執行至少需要一個時鐘週期,有些指令的執行甚至需要超過50個時鐘週期。由於CPU、系統匯流排和儲存電路之間速度的差異,訪問記憶體的指令通常需要稱為等待狀態的空時鐘週期。

2.1.1 指令執行週期

單條機器指令的執行可被分解成一系列的獨立操作,這些操作構成指令執行的一個週期,程式在開始執行之前必須首先裝入記憶體,指令指標包含要執行的下一條指令的地址,指令佇列存放著若干條將要執行的指令。機器指令的執行需要三個基本步驟:取指令、解碼和執行。在指令使用了記憶體運算元時還需要兩個額外的步驟:取運算元和儲存輸出運算元。各個步驟的描述如下:

取指令:控制單元從指令佇列中去的指令並遞增指令指標(IP)的值,指令指標也稱為程式計數器。

解碼:控制單元對指令進行解碼以確定該指令要執行什麼操作。控制單元把輸入運算元傳遞給算術邏輯單元(ALU),並向算術邏輯單元傳送訊號指明要執行的操作。

取運算元:如果指令使用的輸入運算元在記憶體中,控制單元就通過讀取操作獲得運算元並將其複製到內部暫存器中,這些內部及孫琦對使用者是不可見的。

執行:算術邏輯單元執行指令,以有名暫存器和內部暫存器作為運算元,將運算輸出結果送至有名計算器和/或記憶體,然後更新放映處理器狀態的狀態標誌。

儲存輸出運算元:如果輸出運算元在儲存器中,控制單元通過寫操作把資料儲存到記憶體中。

 

    奔騰(Pentium)處理器的基本結構如下圖所示。下圖有助於理解在指令執行週期中進行互動的元件之間的關係。例如,從圖中可以看到資料從記憶體傳送到資料快取、暫存器和ALU的流動路徑。類似地,從圖中還可以看出,算術邏輯單元和暫存器也可以直接讀取資料快取。指令在執行之前被放入程式碼快取,指令解碼器從程式碼快取讀取指令並將讀出的指令送給控制單元。

 

 

多級流水線

    指令執行週期中的每一步至少佔用一個系統時鐘滴答(也稱為一個時鐘週期),但這並不意味著處理器在開始執行下一條指令之前必須等待所有步驟完成,處理器可以並行執行其他步驟,這就是流水線(pipelining)技術。Intel486處理器擁有6級流水線,這6級流水線以及它們的執行部件如下所示:

1.匯流排介面單元BIU,Bus Interface Unit:訪問儲存器並提供輸入輸出。

2.程式碼預取單元Code Prefetch Unit:BIU接受機器指令並將其插入到稱為指令佇列的儲存區域。

3.指令解碼單元Instruction Decode Unit:對預取佇列中的機器指令進行解碼,將它們翻譯成微程式碼。

4.執行單元Execution Unit:執行指令解碼單元產生的微程式碼。

5.分段部件Segment Unit:把邏輯地址轉換為線性地址並進行保護檢查。

6.分頁部件Paging Unit:把線性地址轉換為實體地址,進行頁保護檢查並保留一個最近訪問的頁的列表。

例子:假設處理器內的每個執行階段都需要一個時鐘週期。下圖中表格表示一個未使用流水線處理器的6個執行階段,這也是Intel486之前使用的模型。當指令1-1完成了S6階段之後,指令1-2才開始,所以執行兩條指令需要12個時鐘週期。換句話說,對於分為k個執行階段的處理器,執行n條指令需要(n*k)個時鐘週期。


流水線:上圖所示的CPU的資源存在極大的浪費,因為每級的使用時間僅佔總時間的1/6另一方面,如果處理器支援下圖所示的流水線,新的指令就可以在第二個時鐘週期進入S1階段,與此同時,第一條指令已經進入了S2階段,這允許了指令的交迭執行。下圖所示的兩條指令1-11-2在流水線中一起前進,1-1已進入S2階段,1-2馬上進入S1階段,執行兩條指令總共需要7個時鐘週期。當流水線滿負荷時,所有6個階段一直處於被使用的狀態。

一般對於k級的處理器來說,處理n條指令需要k+(n-1)個週期。前面所示的未使用流水線的處理器處理兩條指令需要12個週期,而使用流水線的處理器在同樣的時間內可以處理7條指令。

 

超標量體系結構

    超標量(superscalar)或多核心處理器有兩條以上的執行流水線,使得兩條指令能同時執行。為了理解超標量處理器的優勢,讓我們重新考慮一下前面流水線的例子。例子中假設了S4階段只需要單個指令週期,但這完全是一種簡化,如果S4需要兩個週期又會發生什麼的?如下圖:

 

這將會產生一種瓶頸效應。在圖中,知道1-1完成S4階段時1-2指令才能進入,因此1-2在進入S4階段之前必須等待一個時鐘週期。當更多的指令進入流水線時,就會產生更多浪費的週期。通常,對於k級(一個階段需要兩個週期)流水線,處理n條指令需要k+2n-1個時鐘週期。

超標量處理器允許多條指令同時處於執行階段。對於n條流水線的情況,n條指令可以在同一時鐘週期內併發執行。Intel奔騰處理器有兩條流水線,它是IA-32系列中的第一個超標量處理器。奔騰Pro是第一個使用三條流水線的處理器。

假設S4階段需要兩個週期,下圖顯示了兩條6級流水線執行指令的情況。在圖中,基數編號的指令進入u流水線,偶數編號的指令進入v流水線,這就消除了對時鐘週期的浪費美因此在k+n個週期內可以執行n條命令,這裡k代表流水線的級數。

 

2.1.3  記憶體的讀取

     程式的吞吐量通常依賴於記憶體的訪問速度。例如,CPU的時脈頻率可能是幾吉赫茲(GHz,然而通過系統匯流排的記憶體訪問卻是一33MHz較慢速率進行的,這迫使CPU在開始執行指令之前要等待至少一個時鐘週期,知道運算元從記憶體中取出為止。這些浪費的時鐘週期稱為等待狀態(wait state)。

從記憶體中讀取指令或資料需要若干個步驟,這是由CPU的內部時鐘控制的。下圖表明處理器時鐘訊號以固定的時間間隔上升和下降,在圖中,時鐘週期開始於時鐘訊號有高變低的時候,俗稱下降沿,它代表了在狀態之間進行轉換所需要花費的時間。

 

 下面是讀取記憶體時的每個時鐘週期內發生事情的簡述:

週期1:記憶體運算元的地址位被放到地址匯流排(ADDR)上。

週期2:讀取先(RD)設為低(0),以通知儲存器要讀一個值。

週期3CPU等待一個週期,給儲存器一些時間已作出響應。在這個時鐘周記憶體控制器把資料放在資料匯流排(DATA)上。

週期4:讀取線(RD)變為1通知CPU在資料匯流排(DATA)上讀取資料。


    快取cache memory:由於常規記憶體與CPU相比是如此之慢,因此計算機使用快取記憶體存放最近使用的指令和資料。程式第一次讀取某塊資料時,在快取中將同時保留有一份副本。程式再次讀取同樣的資料時,首先在快取內查詢,如果快取命中就表明資料已經在快取中了,快取未命中則表明資料不再快取中,必須從常規記憶體中讀取。

    通常,快取對於改善記憶體訪問速度效果明顯,特別是在快取較大時。IA-32處理器有兩種型別的快取:一級快取和耳機快取。與耳機快取相比,以及快取比較小,但速度快,不過也比較昂貴。二級快取過去一直是處理器外獨立儲存,現在已經整合到處理器晶片內部了。

2.1.4  程式是如何執行的

載入和執行程式

下面的步驟按順序描述了當使用者在命令列提示符下執行一個程式時發生的事情:

1.作業系統(OS)在當前磁碟目錄中查詢程式檔名,如果未找到的話,就在預先定義的目錄列表(稱為路徑)中查詢,如果作業系統還是找不到檔名,則顯示一條錯誤資訊。

2.如果找到了程式檔名,作業系統獲取磁碟上程式檔案的基本資訊,包括檔案的大小以及在磁碟驅動上的物理位置。

3.作業系統確定下一個可用記憶體塊地址,把程式檔案裝入記憶體,然後將程式的大小和位置等資訊登記在一張表中(有時稱為描述符表)。另外,作業系統或許還要調整程式內的指標值一邊讓它們指向正確的地址(對重定位項的值進行修正)。

4.作業系統執行一條分支轉移指令,使CPU從程式的第一條機器指令開始執行。程式一旦開始執行,就稱為一個程式。作業系統給程式分配一個標識數字(程式ID,用於在程式的執行期間對其進行跟蹤。

5.這時程式自身已經開始執行,作業系統的任務是跟蹤程式的執行並相應程式對系統資源的請求。

6.程式終結時,其控制程式碼被刪除,程式使用的記憶體也被釋放以便其他程式使用。

多工

多工作業系統能同時執行多個任務,一個任務可以是一個程式(程式)或一個執行執行緒。一個程式擁有自己的記憶體並且可能包含多個執行緒。一個程式內的所有執行緒共享程式的記憶體空間。

通過快速的任務切換,作業系統給人以處理器同時執行多個任務的假象。作業系統使用的一種排程模型,稱其為迴圈排程。如下圖:

 

    多工作業系統執行在支援任務切換的處理器上。對於每個任務,處理器在切換到另一個任務之前儲存當前任務的狀態。任務狀態包含處理器暫存器、程式計數器、狀態標誌以及任務所使用的記憶體內容。多工的作業系統通常為任務分配不同的優先順序,並據此為任務分配相對較大或者較小的時間片。搶佔式多工作業系統允許高優先順序的任務打斷低優先順序的任務,以使系統更加穩定。

相關文章