第六周(10.12-10.18):
學習計時:共10小時 讀書:5 代碼:1 作業:3 部落格:1 |
一、學習目标 |
1. 了解ISA抽象的作用 2. 掌握ISA,并能舉一反三學習其他體系結構 3. 了解流水線和實作方式 |
二、學習資源 |
1. 教材:第四章《處理器體系結構》,詳細學習指導見這:重點是4.1-4.3 2. 課程資料:https://www.shiyanlou.com/courses/413 實驗五,課程邀請碼:W7FQKW4Y 3. 教材中代碼運作、思考一下,讀代碼的學習方法見這。 |
三、學習方法 |
1. 進度很重要:必須跟上每周的進度,閱讀,練習,問答,項目。我會認真對待每一位同學,請你不要因為困難半途而廢。 2. 問答很重要:遇到知識難點請多多提問,這是你的權利更是您對自己負責的義務。問答到部落格園讨論小組:http://group.cnblogs.com/103791/ 3. 實踐很重要:解決書中習題,實踐書中執行個體,完成每周項目,才算真的消化了這本好書。通過實驗樓環境或自己安裝的虛拟機在實踐中進行學習 4. 實驗報告很重要:詳細記錄你完成項目任務的思路,獲得老師點評和幫助自己複習。學習完成後在部落格園中(http://www.cnblogs.com/)把學習過程通過部落格發表,部落格标題"資訊安全系統設計基礎第六周學習總結" |
四、學習任務 |
(提示:請将要求學生完成的任務、測驗或思考題列在此處) 1. 閱讀教材,完成課後練習(書中有參考答案) 4.1-4.3中練習,重點:4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24 2. 考核:練習題把資料變換一下 3. 實驗:需要動手的到實驗樓中練習一下 |
五、後續學習預告(可選): |
第六章《存儲器層次結構》 |
六、學習過程 |
(提示:此處由學生填寫,學習過程,學習筆記,代碼編譯,運作結果,思考等) |
七、遇到的問題及解決 |
(提示:此處由學生填寫,是重要的得分點,要寫出遇到的問題和解決方案以及對出現問題的思考) |
八、其他 |
(提示:此處由學生填寫,靈感,領悟等) |
第六周:學習任務教材 第四章
本章内容是處理器體系結構,重點掌握ISA,并能舉一反三;本章帶着大家設計并實作了一個結合CISC和RISC思想的處理器Y86,一個類IA32體系的處理器;ISA在編譯器編寫者和處理器設計者之間提供了一個抽象。
本章重點是4.1-4.3,流水線部分4.4-4.5供學有餘力的同學自學
練習題:4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24
第四章
處理器體系結構
一個處理器支援的指令和指令的位元組級編碼稱為它的指令集體系結構ISA。
4.1 Y86指令集體系結構
4.1.1程式員可見狀态
Y86程式中的每條指令都會讀取或者修改處理器狀态的某些部分這稱為程式員可見狀态。這裡的"程式員"既可以是用彙編代碼寫程式的人,也可以是産生機器級代碼的編譯器。在處理器實作中,隻要我們保證機器級程式能夠通路程式員可見狀态,就不需要完全按照ISA隐含的方式來表示群組織從這個處理器狀态。Y86有8個程式寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。
有3個一位的調價嗎:ZF、SF、OF,它們儲存最近的算術或邏輯指令所造成影響的有關資訊。
程式員可見狀态:

存儲器,從概念上說就是一個很大的位元組數組,儲存着程式和資料。Y86程式用虛拟位址來引用存儲器位置。硬體和作業系統軟體聯合起來将虛拟位址翻譯成實際或實體位址,指明資料實際儲存在存儲器中哪個地方。
程式狀态的最後一個部分是狀态碼Stat,表明程式執行的總體狀态。
4.1.2 Y86指令
Y86指令集:
·IA3的movl指令分成了4個不同的指令:irmovl、rrmovl、mrmovl、rmmovl,分别顯式地指明源和目的格式,可以是立即數、寄存器或寄存器。指令名字的第一個字母就表明了源的類型,目的可以是寄存器或存儲器。指令名字的第二個字母指明了目的類型,在決定如何實作資料傳送時,顯式地指明資料傳送的這4種類型很有幫助。
兩個存儲器傳送指令中的存儲器引用方式是簡單的基址和偏移量形式。不支援第二變址寄存器和任何寄存器值的伸縮。
同IA32一樣,不允許從一個存儲器位址直接傳送到另一個存儲器位址。也不允許将立即數傳送到存儲器。
·有4個整數操作指令
·7個跳轉指令
·6個條件傳送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg
·call指令将傳回位址入棧,然後跳到目的位址。Ret指令從這樣的過程調用中傳回。
·pushl和popl指令實作了入棧和出棧
·halt指令停止指令的執行。
4.1.3指令編碼
Rrmovl與條件傳送有同樣的指令代碼。可以把它看做是一個"無條件傳送",就好像jmp指令是無條件跳轉一樣,它們的功能代碼都是0。
Y86指令集的功能碼:
8個程式寄存器中每個都有相應的0~7的寄存器辨別符。
程式寄存器存在CPU的一個寄存器檔案中,這個寄存器檔案就是一個小的、以寄存器ID作為位址的随機通路存儲器。在指令編碼中以及在我們的設計中,當需要指明不應通路任何寄存器是,就用ID值0xF表示。
可能有附加的寄存器訓示符位元組制定一個或兩個寄存器。根據指令類型,指令可以指定用于資料源和目的的寄存器,或是用于位址計算的基址寄存器。沒有寄存器操作數的指令,就沒有寄存器訓示符位元組。那些隻需要一個寄存器操作數得指令将另一個寄存器訓示符設為0xF。
有些指令需要一個附加的4位元組常數字。這個字能作為irmovl的立即數資料,rmmovl和mrmovl的位址訓示符的偏移量,以及分支指令和調用指令的目的位址。分支指令和調用指令的目的地隻是一個絕對位址,而不是像IA32中那樣使用PC相對尋址方式。所有整數采用小端法編碼,當指令按照反彙編格式書寫時,這些位元組就以相反的順序出現。
指令集的一個重要性質就是位元組編碼必須有唯一的解釋。每條指令的第一個字街有唯一的代碼和功能組合,給定這個位元組,我們就可以決定所有其他附加位元組的長度和含義。這個性質保證了處理器可以無二地執行目标代碼程式。
CISC和早期的RISC:
、
4.1.4 Y86異常
程式員可見的狀态包括stat狀态碼,他描述程式執行的總體狀态。Y86狀态碼:
處理器通常會調用一個異常處理程式,被指定用來處理遇到的某種類型的異常,異常處理程式可以被配置成不同的結果,放棄程式或者調用一個使用者自定義的信号處理程式。
Y86沒有伸縮尋址模式。
以"."開頭的詞是彙編器指令,它們告訴彙編器調整位址,以便在那兒産生代碼或插入一些資料。建立Y86代碼的唯一工具是彙編器,程式員必須執行本來通常交給編譯器、連結器和運作時系統同來完成的任務。
指令集模拟器稱為YIS,模拟Y86機器代碼程式的執行,不用試圖去模拟任何及具體處理其實作的行為。有助于在有實際硬體可用之前調試程式,也有助于檢查模拟硬體或者在硬體上運作程式的結果。
4.1.6一些Y86指令的詳情
大多數Y86指令是以一種直接的方式修改程式狀态的,是以定義每條指令想要達到的結果并不困難。
Pushl指令會把棧指針減去4,并且将一個寄存器值寫入存儲器中,執行pushl%esp時,處理器的行為是不确定的,因為要入棧的寄存器會被同一條指令修改,通常有兩種約定:1.壓入%esp的原始值,2.壓入減去4的%esp值。
當執行壓入棧指針寄存器指令時,不同的型号的x86處理器會做不同的事情,有些會壓入原始的值,而有些會壓入減去後的值。2個缺點:
·它降低了代碼的可移植性
·它增加了文檔的複雜性
要實作一個數字系統需要三個主要的組成部分:計算對位進行操作的函數的組合邏輯,存儲位的存儲器元素以及控制存儲器元素更新的時鐘信号。
4.2邏輯設計和硬體控制語言HCL
4.2.1邏輯門
邏輯門是數字電路的基本計算元素。産生的輸出等于它們輸入位值的某個布爾函數。邏輯門總是活動的,一旦一個門的輸入變化了,在很短的時間内,輸出就會相應地變化。
邏輯門類型:
4.2.2組合電路和HCL布爾表達式
将很多的邏輯門組合成一個網,救恩給你建構計算塊,稱為組合電路。兩條限制:
兩個或多個邏輯門的輸出不能連在一起
這個網必須是無環的
4.2.3字級的組合電路和HCL整數表達式
将邏輯門組合成大的網,可以構造出能計算更加複雜函數的組合電路。
執行字級計算的組合電路根據輸入字的各個位,用邏輯門來計算輸出字的各個位。
處理器中會用到很多種多路複用器。在HCL中,多路複用函數使用情況表達式來描述的。
邏輯上講,這些選擇表達式是順序求值的,且第一個求值為1的情況下會被選中。
允許不互斥的選擇表達式使得HCL代碼的可讀性更好。
選擇表達式可以是任意的布爾表達式,可以有任意多的情況,這就使得情況表達式能描述帶複雜選擇标準的、多種輸入信号的塊。
組合邏輯電路可以設計成在字級資料上執行許多不同類型的操作。算數/邏輯單元(ALU)是一種很重要的組合電路。
算數/邏輯單元(ALU):
4.2.4集合關系
在處理器設計中,很多時候都需要将一個信号與許多可能比對的信号做比較,以此來檢測真該處理的某個指令代碼是否屬于某一類指令代碼。
4.2.5存儲器和時鐘
組合電路從本質上講不存儲任何資訊。隻是簡單地相應輸入信号,産生等于輸入的某個函數的輸出。儲存設備都是由同一個時鐘控制,始終是一個周期性信号,決定什麼時候要把新值加載到裝置中。兩類存儲器裝置:
·時鐘存儲器(簡稱寄存器)存儲單個位或字。時鐘信号控制寄存器加載輸入值。
·随機通路存儲器(簡稱存儲器)存儲多個字,用位址來選擇該讀或者該寫那個字。
硬體和機器級程式設計時,"寄存器"這個詞是兩個有細微差別的。硬體中,寄存器直接将它的輸入和輸出線連接配接到電路的其他部分,機器級程式設計中,寄存器代表的是CPU中為數不多的可尋址的字,這裡的位址是寄存器ID。分别稱呼為"硬體寄存器""程式寄存器"
寄存器操作:
寄存器檔案有兩個讀端口還有一個寫端口。這樣一個多端口随機通路存儲器允許同時進行讀和寫操作。
想寄存器檔案寫入字是由時鐘信号控制的,控制方式類似于将值加載到時鐘寄存器。
雙端口的存儲器:一個用來讀指令,另一個用來讀或者寫資料。
4.3 Y86的順序實作
4.3.1将處理組織成階段
取值:從存儲器讀取指令位元組,位址為程式計數器PC的值。
譯碼:譯碼階段從寄存器檔案讀入最多兩個操作數。
執行:ALU要麼執行指明的操作,計算存儲器引用的有效位址,要麼增加或減少棧指針。
訪存:可以将資料寫入存儲器或者從存儲器讀出資料。
寫會:最多可以寫兩個結果到寄存器檔案。
更新PC:将PC設定成下一條指令的位址。
降低複雜度的一種方法是讓不同的指令共享盡量多的硬體。
Y86指令序列:
執行rrmovl指令和執行算術運算類似,不過不需要取第二個寄存器操作數。
Y86指令pushl和popl在順序實作中的計算:
三類控制轉移指令的處理:各種跳轉、call和ret
Y86指令jXX、call和ret在順序實作中的計算:
對指令call我們要将valP也就是call指令後緊跟着的那條指令的位址壓入棧中。在更新PC階段将PC設為valC也就是調用的目的地。對指令ret在更新PC階段我們将valM從棧中取出的值賦給PC。
4.3.2 SEQ硬體結構
實作所有Y86指令所需要的計算可以組織成6個基本階段:取指,譯碼,執行,訪存,寫回和更新PC。
取指:将程式計數器寄存器作為位址,指令存儲器讀取指令的位元組。
譯碼:寄存器檔案有兩個讀端口從這兩個端口同時讀寄存器值valA和valB
條件碼寄存器有三個條件碼位
訪存:在執行訪存操作時,資料存儲器讀出或寫入一個寄存器字。指令和資料存儲器通路的是相同的存儲器位置但是用于不同的目的。
寫回:寄存器檔案有兩個寫端口。E用來寫ALU計算出來的值,而端口M用來寫從資料存儲器中讀出的值。
4.3.3 SEQ的時序
SEQ的實作包括組合邏輯和兩種存儲器裝置:時鐘寄存器(程式計數器和條件碼寄存器),随機通路存儲器(寄存器檔案、指令存儲器和資料存儲器)。組合邏輯不需要任何時序或控制——隻要輸入變化,值就會通過邏輯門網絡傳播。
每個時鐘周期,程式計數器都會裝在新的指令位址,隻有在執行整數運算指令時,才會裝在條件碼寄存器,隻有偶在執行rmmovl、pushl或call指令時,才會寫資料存儲器。寄存器檔案的兩個寫端口允許每個時鐘周期更新2個程式寄存器。
要控制處理其中的活動時序,隻需要寄存器和存儲器的時鐘控制。
——處理器從來不需要為了完成一條指令的執行而去讀由該指令更新了的狀态。
SEQ硬體結構:
辨別順序實作的不同計算步驟:
4.3.4 SEQ階段的實作
HCL描述中使用的常數值:
- 取指階段
包括指令存儲器硬體單元
- 譯碼和寫回階段
寄存器檔案有四個端口。它支援同時進行兩個讀和兩個寫,每個端口都有一個位址連接配接和一個資料連接配接,位址連結是一個寄存器ID而資料連結是一組32根線路,即可以作為寄存器檔案的輸出字,也可以作為它的輸入字。
- 執行階段
包括ALU,它通常是作為加法器來使用。還包括條件碼寄存器。ALU每次運作都會産生三個與條件碼相關的信号——零、符号和溢出。
标号為"cond"的硬體單雲會根據條件碼和功能碼來确定是否進行條件分支或者條件資料傳送
- 訪存階段
任務就是讀或者寫程式資料
- 更新PC階段
最後一個階段會産生程式計數器的新值
- SEQ小結
唯一的問題就是太慢了,時鐘必須非常慢,以使得信号能在一個周期内傳播所有的階段。
4.4流水線的通用原理
流水線化的一個重要特性就是增加了系統的吞吐量,也就是機關時間内服務的顧客總數,不過他也會輕微增加延遲,也就是服務一個使用者所所需要的時間。
4.4.1 計算流水線
現代邏輯設計中,電路延遲以微微秒作為機關計算。我們以每秒千兆條指令也就是每秒十億條指令,為機關來描述吞吐量。從頭到尾執行一條指令所需要的時間稱為延遲。
4.4.2流水線操作的詳細說明
4.4.3 流水線的局限性
1.不一緻的劃分
2.流水線過深,受益反而下降
4.4.4帶回報的流水線系統
每一對相鄰的指令之間都有資料相關
另一種相關是由于指令控制流造成的順序相關
4.5 Y86的流水線實作
4.5.1 SEQ+:重新安排計算階段
SEQ到SEQ+中隊狀态元素的改變是一種通用的改進例子,這種改進稱為電路重定時。重定時改變了一個系統的狀态表示,但是并不改變他的邏輯行為。通常用它來平衡一個系統中各個階段之間的延遲。
4.5.2插入流水線寄存器
SEQ+的各個階段之間插入流水線寄存器,并對信号重新排列得到PIPE—處理器,性能稍差一點。
4.5.3對信号進行重新排列和标号
最系統的方法就是讓與每條指令關聯的狀态碼與指令一起通過流水線。
4.5.4預計下一個PC
流水線化設計的目的就是每個時鐘周期都發射一條新指令,也就是說每個時鐘周期都有一條新指令進入執行階段并最終完成。要是達到這個目的就意味着吞吐量是每個時鐘周期一條指令。
我們的設計使用總是選擇分支的預測政策。
4.5.5 流水線冒險
PEPE-結構是建立一個流水線化的Y86處理器的好開端。冒險分為兩類:資料冒險和控制冒險。
4.5.6用暫停來避免資料冒險
暫停時避免冒險的一種常用技術,暫停時,處理器會停止流水線一條或多條指令,直到冒險條件不再滿足。
暫停技術就是讓一組指令阻塞在他們所處的階段,而允許其他指令繼續通過流水線。
4.5.7用轉發來避免資料冒險
将結果隻直接從一個流水線階段傳到較早階段的技術叫做資料轉發,或是轉發,有時稱為旁路。
4.5.8 加載/使用資料冒險
有一類資料冒險不能單純用轉發來解決,因為存儲器讀在流水線發生的比較晚。
用暫停來處理加載/使用冒險的方法稱為加載互鎖,加載互鎖和轉發技術結合起來足以處理所有可能類型的資料冒險
4.5.9異常處理
異常可以由程式執行從内部産生,也可以有某個外部信号從外部産生。我們的指令集體系結構包括三種不同的内部異常:1.halt指令 2.由非法指令和功能碼組合的指令 3.取指或資料讀寫試圖通路一個非法位址
我們把導緻異常的指令稱為異常指令。
異常處理包括一些細節問題。首先可能同時又多條指令會引起異常,第二個細節問題是,當首先取出一條指令,開始執行時,導緻了一個異常,而後來由于分支預測錯誤,取消了該指令。第三個細節問題的産生是因為流水線化的處理器會在不同的階段更新系統狀态的不同部分。
為了避免異常指令之後的指令更新任何程式員可見的狀态,當處于訪存或者寫回狀态中的指令導緻異常時,流水線控制邏輯必須禁止更新條件碼寄存器或是資料存儲器。
4.5.10 PIPE各階段的實作
1.PC選擇和取指階段
2.譯碼和寫回階段
3.執行階段
4.訪存階段
4.5.11流水線控制邏輯
處理ret:流水線必須暫停直到ret指令到達寫回階段
加載/使用冒險:在一條從存儲器中讀取一個值的指令和一條使用該值的指令之間,流水線必須暫停一個周期
預測錯誤的分支:在分支邏輯發現不應該選擇分支之前,分支目标處的幾條指令已經進入流水線了,必須從流水線中去掉這些指令。
異常:當一條指令導緻異常,我們想要禁止後面的指令更新程式員可見狀态,并且在異常指令到達寫回階段時,停止執行。
- 特殊控制情況所期望的處理
- 發現特殊控制條件
- 流水線控制機制
- 控制條件的組合
- 控制邏輯實作
4.6小結
ISA在處理器行為和如何實作處理器之間提供了一層抽象。ISA提供了程式執行的一種順序說明,也就是一條指令執行完了,下一條指令才會開始。
ISA既有RISC指令集的屬性,也有CISC指令集的屬性。
流水線化通過讓不同的階段并行操作,改進了系統的吞吐量性能。
重要經驗:
·管理複雜性是首要問題
·不需要直接實作ISA
·硬體設計人員必須非常謹慎小心