Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-上
第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)執行加法和減法等算術運算,以及AND,OR和NOT等邏輯運算。
? ? 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-1和1-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),以通知存儲器要讀一個值。
周期3:CPU等待一個周期,給存儲器一些時間已作出響應。在這個時鐘周內存控制器把數據放在數據總線(DATA)上。
周期4:讀取線(RD)變為1通知CPU在數據總線(DATA)上讀取數據。
????緩存(cache memory):由于常規內存與CPU相比是如此之慢,因此計算機使用高速緩存存放最近使用的指令和數據。程序第一次讀取某塊數據時,在緩存中將同時保留有一份副本。程序再次讀取同樣的數據時,首先在緩存內查找,如果緩存命中就表明數據已經在緩存中了,緩存未命中則表明數據不再緩存中,必須從常規內存中讀取。
????通常,緩存對于改善內存訪問速度效果明顯,特別是在緩存較大時。IA-32處理器有兩種類型的緩存:一級緩存和耳機緩存。與耳機緩存相比,以及緩存比較小,但速度快,不過也比較昂貴。二級緩存過去一直是處理器外獨立存儲,現在已經集成到處理器芯片內部了。
2.1.4 ?程序是如何運行的
加載和執行程序
下面的步驟按順序描述了當用戶在命令行提示符下運行一個程序時發生的事情:
1.操作系統(OS)在當前磁盤目錄中查找程序文件名,如果未找到的話,就在預先定義的目錄列表(稱為路徑)中查找,如果操作系統還是找不到文件名,則顯示一條錯誤信息。
2.如果找到了程序文件名,操作系統獲取磁盤上程序文件的基本信息,包括文件的大小以及在磁盤驅動上的物理位置。
3.操作系統確定下一個可用內存塊地址,把程序文件裝入內存,然后將程序的大小和位置等信息登記在一張表中(有時稱為描述符表)。另外,操作系統或許還要調整程序內的指針值一邊讓它們指向正確的地址(對重定位項的值進行修正)。
4.操作系統執行一條分支轉移指令,使CPU從程序的第一條機器指令開始執行。程序一旦開始運行,就稱為一個進程。操作系統給進程分配一個標識數字(進程ID),用于在進程的運行期間對其進行跟蹤。
5.這時進程自身已經開始運行,操作系統的任務是跟蹤進程的執行并相應進程對系統資源的請求。
6.進程終結時,其句柄被刪除,進程使用的內存也被釋放以便其他進程使用。
多任務
多任務操作系統能同時運行多個任務,一個任務可以是一個程序(進程)或一個執行線程。一個進程擁有自己的內存并且可能包含多個線程。一個進程內的所有線程共享進程的內存空間。
通過快速的任務切換,操作系統給人以處理器同時運行多個任務的假象。操作系統使用的一種調度模型,稱其為循環調度。如下圖:
?
? ??多任務操作系統運行在支持任務切換的處理器上。對于每個任務,處理器在切換到另一個任務之前保存當前任務的狀態。任務狀態包含處理器寄存器、程序計數器、狀態標志以及任務所使用的內存內容。多任務的操作系統通常為任務分配不同的優先級,并據此為任務分配相對較大或者較小的時間片。搶占式多任務操作系統允許高優先級的任務打斷低優先級的任務,以使系統更加穩定。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel汇编语言程序设计学习-第一章
- 下一篇: Intel汇编语言程序设计学习-第二章