信息安全系統設計基礎第六週學習總結

信息安全系統設計基礎第六週學習總結

第六週(10.12-10.18):

學習計時:共12小時
讀書:4
代碼:1
做業:3
博客:4html

第四章 處理器體系結構

現代微處理器能夠稱得上是人類創造的最複雜的系統之一。一塊手指甲大小的硅片上,能夠容納一個完整的高性能處理器、大的高速緩存,以及用來鏈接到外部設備的邏輯電路。linux

  1. 到目前爲止,咱們看到的計算機系統只限於機器語言程序級。咱們知道處理器必須執行系列指令,每條指令執行某個簡單操做,例如兩個數相加。指令被編碼爲由一個或多個字節序列組成的二進制格式。
  2. 不一樣的處理器「家族」,例如intel ia32性能和複雜性不斷提升,可是不一樣的型號在ISA級別上都保持着兼容。一些常見的處理器家族(例如IA32)中的處理器分別由多個廠商提供。

4. 1Y86指令集體系結構

4.1.1程序員可見的狀態

  • Y86程序中的每條指令都會讀取或修改處理器狀態的某些部分。這稱爲程序員可見狀態。這裏的「程序員」既能夠是用匯編代碼寫程序的人,也能夠是產生機器級代碼的編譯器。在處理器實現中,只要咱們保證機器級程序可以訪問程序員可見狀態,就不須要徹底按照ISA隱含的方式來表示和組織這個處理器狀態。Y86的處理器狀態相似於IA32。
  • 有8個程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp和%ebp。處理器的每一個程序寄存器存儲一個字。
  • 程序計數器存放當前正在執行指令的地址。

4.1.2Y86指令

  • Y86指令集基本上是IA32指令集的一個子集。它只包括四字節整數操做,尋址方式比較少,操做也較少。
  • 四字節數據,因此稱之爲「字」不會有歧義。
  • 彙編代碼格式相似於IA32的ATT格式。

4.1.3指令編碼

  • 每條指令須要1~6個字節不等,這取決於須要哪些字段。
  • Y86中的寄存器編號跟IA32中的相同。程序寄存器存在CPU中的一個寄存器文件中,這個寄存器文件就
    是一個小的、以寄存器ID做爲地址的隨機訪問存儲器。在指令編碼中以及在咱們的硬件設計中,當須要指明不該訪問任何寄存器時,就用ID值0xF來表示。
  • 有的指令只有一個字節長,而有的須要操做數的指令編碼就更長一些。首先,可能有附加的寄存器指示符字節,指定一個或兩個寄存器。
  • 從指令的彙編代碼表示中能夠看到,根據指令類型,指令能夠指定用於數據源和目的的寄存器,或是用於地址計算的基址寄存器。沒有寄存器操做數的指令,例如分支指令和call指令,就沒有寄存器指示符字節。那些只須要一個寄存器操做數的指令將另外一個寄存器指示符設爲OxF。這種約定在咱們的處理器實現中很是有用。
  • 有些指令須要一個附加的4字節常數字。

4.1.4Y86異常

對於Y86,當遇到這些異常的時候,咱們就簡單地讓處理器中止執行指令。在更完整的的設計中,處理器一般會調用一個異常處理程序,這個過程被指定用來處理遇到的某種類型的異常。就像在第8章中講述的,異常處理程序能夠被配置成不一樣的結果,例如,放棄程序或者調用一個用戶自定義的信號處理程序。程序員

4.1.5Y86程序

程序中以「.」開頭的詞是彙編器命令。緩存

4.1.6一些Y86的詳情

  • 大多數Y86指令是以一種直接的方式修改程序狀態的,因此定義每條指令想要達到的結果並不困難。不過,兩個特別的指令組合須要特別注意一下。pushl指令會把棧指針減4,而且將一個寄存器值寫入存儲器中。所以,當執行pushl %esp指令時,處理器的行爲是不肯定的,由於要入棧的寄存器會被同一條指令修改。
  • 一般有兩種約定:1)壓入%esp的原始值,2)壓入減去4的%esp的值。

4. 2邏輯設計和硬件控制語言HCL

4.2.1邏輯門

4.2.2組合電路和HCL布爾表達式

圖4-11多路複用器根據輸入控制信號的值,從一組不一樣的數據信號中選出一個,在這個單個位的多路複用器中,兩個數據信號是輸入位a和b,控制信號是輸入位s,當s爲1時,輸出等於a:而當s爲0時,輸出等於b。在這個電路中,咱們能夠看出兩個AND門決定了是否將它們相對應的數據輸入傳送到OR門。
HCL表達式很清楚地代表了組合邏輯電路和C語言中邏輯表達式的對應之處。它們都是用布爾操做來對輸入進行計算的函數。值得注意的是,這兩種表達計算的方法之間有如下區別:安全

由於組合電路是由一系列的邏輯門組成,它的屬性是輸出會持續地響應輸入的變化。若是電路的輸入變化了,在必定的延時以後,輸出也會相應的變化。相比之下,C表達式只會在程序執行過程當中被遇到時才進行求值。
C的邏輯表達式容許參數是任意整數,0表示FALSE,其餘任何值都表示TRUE。而邏輯門只對位值0和1進行操做.
C的邏輯表達式有個屬性就是它們可能只被部分求值。若是―個AND或OR操做的結果只用對第一個參數求值就能肯定,那麼就不會對第二個參數求值了。markdown

4.2.3字級的組合電路和HCL整數表達式

  • 經過將邏輯門組合成大的網,能夠構造出能計算更加複雜函數的組合電路。一般,咱們設計能對數據字進行操做的電路。有一些位級信號表明一個整數或一些控制模式。例如咱們的處理器設計將包含有不少字,字的大小爲4位和32位,表明整數、地址、指令代碼和寄存器標識符。
  • 執行字級計算的組合電路根據輸入字的各個位,用邏輯門來計算輸出字的各個位。
  • 選擇表達式能夠是任意的布爾表達式,能夠有任意多的狀況。這就使得狀況表達式能描述帶複雜選擇標準的、多種輸入信號的塊。

4.2.4集合關係

在處理器設計中,不少時候都須要將一個信號與許多可能匹配的信號作比較,以此來檢測正在處理的某個指令代碼是否屬於某一類指令代碼。app

4.2.5存儲器和時鐘

爲了產生時序電路,咱們必須引入按位存儲信息的設備。存儲設備都是由同一個時鐘控制,時鐘是一個週期性信號,決定何時要把新值加載到設備中。考慮兩類存儲器設備:框架

1.時鐘寄存器(簡稱寄存器)存儲單個位或字。時鐘信號控制寄存器加載輸入值。
2.隨機訪問存儲器(簡稱存儲器)存儲多個字,用地址來選擇該讀或該寫哪一個字。隨機訪問存儲器的例子包括:1)處理器的虛擬存儲器系統,硬件和操做系統軟件結合起來使處理器能夠在一個很大的地址空間內訪問任意的字;2)寄存器文件,在此,寄存器標識符做爲地址。在IA32或Y86處理器中,寄存器文件有8個程序寄存器。函數

大多數時候,寄存器都保持在穩定狀態(用×表示)產生的輸出等於它的當前狀態。信號沿着寄存器前面的組合邏輯傳播這時,產生了一個新的寄存器輸入(用y表示)但只要時鐘是低電位的,寄存器的輸出就仍然保持不變。當時鍾變成高電位的時候,輸入信號就加載到寄存器中,成爲下一個狀態y直到下一個時鐘上升沿,這個狀態就一直是寄存器的新輸出。關鍵是寄存器是做爲電路不一樣部分中的組合邏輯之間的屏障。每當每一個時鐘到達上升沿時,值纔會從寄存器的輸入傳送至輸出。性能

4.3 y86的順序(sequential)實現

4.3.1將處理組織成階段

一般,處理一條指令包括不少操做。將它們組織成某個特殊的階段序列,即便指令的動做差別很大,但全部的指令都遵循統一的序列。每一步的具體操做取決於正在執行的指令。建立這樣的框架,咱們便能設計一個充分利用硬件的處理器。簡略描述:

取指
譯碼
執行
訪存
寫回
更新PC

咱們面臨的一個挑戰是將每條不一樣指令所須要的計算放入到上述那個通用框架中。咱們會使用圖4-17中所示的代碼來描述不一樣Y86指令的處理。表中的這種格式很容易映射到硬件,表中的每一行都描述了一個信號或存儲狀態的分配。閱讀時能夠把它當作是從上至下的順序求值。當咱們將這些計算映射到硬件時,會發現其實並不須要嚴格按照順序來執行這些求值。

4.3.2SEQ硬件結構

硬件單元與各個處理階段相關聯:

  • 取指:將程序計數器寄存器做爲地址,指令存儲器讀取指令的字節。
  • 譯碼:寄存器文件有兩個讀端口A和B,從這兩個端口同時讀寄存器值
  • 執行:執行階段會根據指令的類型,將算術/邏輯單元用於不一樣的目的。對整數操做,它要執行指令所指定的運算。對其餘指令,它會做爲一個加法器來計算增長或減小棧指針,或者計算有效地址,或者只是簡單地加0,將一個輸入傳遞到輸出。
  • 訪問:在執行訪問操做時,數據存儲器讀出或寫入一個存儲器字。
  • 寫回:寄存器文件有兩個寫端口。

4.3.3SEQ的時序

SEQ的實現包括組合邏輯和兩種存儲器設備:時鐘寄存器,隨機訪問存儲器(寄存器文件、指令存儲器和數據存儲器)。組合邏輯不須要任什麼時候序或控制。對於較小的存儲器來講(例如寄存器文件)這是一個合理的假設,而對於較大的電路來講,能夠用特殊的時鐘電路來模擬這個效果。因爲指令存儲器只用來讀指令,所以咱們能夠將這個單元當作是組合邏輯。

4.3.4SEQ階段的實現

寄存器文件有四個端口,它支持同時進行兩個讀(在端口A和B上)和兩個寫(在端口E和M)。每一個端口都有一個地址鏈接和―個數據鏈接,地址鏈接是一個寄存器ID,而數據鏈接是一組32根線路,既能夠做爲寄存器文件的輸出字,也能夠做爲它的輸入字。若是某個地址端口上的值爲特殊標識符0xF,則代表不須要訪問寄存器。

4.4 流水線的通用原理

4.4.1計算流水線

在現代邏輯設計中,電路延遲以微微秒,也就是10的負12次方秒爲單位來計算。

4.4.2流水線操做的詳細說明

爲了更好地理解流水線是怎樣工做的,詳細看看流水線計算的時序和操做。圖4-34是三階段流水線的流水線圖,流水線階段之間的指令轉移是由時鐘信號來控制的"每隔120ps,信號從0上升至1開始下一組流水線階段的計算。

4.4.3流水線的侷限性

4.4.4帶反饋的流水線系統

4.5 y86的流水線實現

4.5.1SEQ+從新安排計算階段

做爲實現流水線化設計的一個過渡步驟,咱們必須稍微調整一下SEQ中五個階段的順序,使得更新PC階段在一個時鐘週期開始時執行,而不是結束時才執行。只須要對總體硬件結構作最小的改動,對於流水線階段中的活動的時序,它能工做得更好。咱們稱這和修改過的設計爲「SEQ+」。咱們移動PC階段,使得它的邏輯在時鐘週期開始時活動,使它計算當前指令的PC值。

4.5.2插入流水線寄存器

4.5.3對信號進行從新排列和標號

順序實現SEQ和SEQ+在一個時刻只處理一條指令。在流水線化的設計中,與各個指令相關聯的值有多個版本,會隨着指令一塊兒流過系統。咱們須要很當心以確保使用的是正確版本確版本的信號,不然會致使很嚴重的錯誤。經過在信號名前面加上大寫的流水線寄存器名字做爲前綴,存儲在流水線寄存器中的信號能夠惟一的被標識。

4.5.4預測下一個PC

在PIPE―設計中,咱們採起了一些措施來正確處理控制相關。流水線化設計的目的就是每一個時鐘週期都發射一條新指令,也就是說每一個時鐘週期都有一條新指令進入執行階段並最終完成。要是達到這個目的就意味着吞吐量是每一個時鐘週期一條指令。要作到這一點,咱們必須在取出當前指令以後,立刻肯定下一條指令的位置。不幸的是,若是取出的指令是條件分支指令,要到幾個週期後,也就是指令經過執行階段以後,咱們才能知道是否要選擇分支。相似地,若是取出的指令是ret,要到指令經過訪存階段,才能肯定返回地址。

4.5.5流水線冒險

PIPE-結構是建立一個流水線化的Y86處理器的好開端。不過,回憶4.44節中的討論,將流水線技術引入一個帶反饋的系統,當相鄰指令同存在相關時會致使出現問題。在完成咱們的設計以前,必須解決這個問題。
這些相關有兩種形式:

1)數據相關,下一條指令會用到這條指令計算出的結果;
2)控制相關,一條指令要肯定下一條指令的位置,例如在執行跳轉、調用或返回指令時,這些相關可能會致使流水線產生計算錯誤,稱爲冒險。同相關同樣,冒險也能夠分爲兩類:數據冒險和控制冒險。

4.5.6用暫停來避免數據冒險

暫停是避免冒險的―種經常使用技術,暫停時,處理器會中止流水線中一條或多條指令,直到冒險條件再也不知足,讓一條指令停頓在譯碼階段,直到產生它的源操做數的指令經過了寫回階段,這樣咱們的處理器就能避免數據冒險,。它對流水線控制邏輯作了一些簡單的增強。當指令addl處於譯碼階段時,流水線控制邏輯發現執行、訪存或寫回階段中至少有―條指令會更新寄存器。

4.5.7用轉發來避免數據冒險

爲了充分利用數據轉發技術,咱們還能夠將新計算出來的值從執行階段傳到譯碼階段,以免程序prog4所須要的暫停。在週期4中,譯碼階段邏輯發如今訪存階段中有對寄存器%edX未進行的寫,並且執行階段中ALU正在計算的值稍後也會寫入寄存器%eaX。它能夠將訪存階段中的值做爲操做數Va1A也能夠將ALU的輸出做爲操做數~Va1B,注意,使用ALU的輸出不會致使任什麼時候序問題,譯碼階段只要在時鐘週期結束以前產生信號Va1A和Va1B,在時鐘上升開始下一個週期時,流水線寄存器E就能裝載來自譯碼階段的值,而在此以前ALU的輸出已是合法的了。

4.5.8加載/使用數據冒險

有類數據冒險不能單純用轉發來解決,由於存儲器在流水線發生的比較晚。

4.5.9異常處理

咱們的指令集體系結構包括三種不一樣的內部產生的異常:1:)halt指令,2)有非法指令和功能碼組合的指令, 3)取指或數據讀寫試圖訪問一個非法地址。正確處理異常是任何微處理器設計中頗有挑戰性的一面。異常可能出如今不可預測的時間,須要明確的中斷經過處理器流水線的指令流。

4.5.10PIPE各階段的實現

4.5.11流水線控制邏輯

如今準備建立流水線控制邏輯,以完成咱們的PIPE設計。這個邏輯必須處理如下4種控制狀況,這些狀況是其餘機制(例如數據轉發和分支預測)不能能處理的:

處理ret:流水線必須暫停直到ret指令到達寫回階段。
加載/使用冒險:流水線必須暫停一個週期。
預測錯誤的分支:在分支邏輯發現不該該選擇分支以前,分支目標處的幾條指令已經進流水線了。必須從流水線中去掉這些指令。
異常:當―條指令致使異常,咱們想要禁止後面的指令更新程序員可見的狀態,並睏異常指令到達寫回階段時,中止執行。
咱們先瀏覽每種狀況所指望的行爲,而後再設計處理這些狀況的控制邏輯。

4.5.12性能分析

咱們能夠看到,全部須要流水線控制邏輯進行特殊處理的條件,都會致使流水線不可以實現每一個時鐘週期發射一條新指令的目標。咱們能夠經過肯定往流水線中插入氣泡的頻率,來衡量這種效率的損失。由於插入氣泡會引起未使用的流水線週期。一條返回指令會產生三個氣泡,一個加載/使用冒險會產生一個,而一個預測錯誤的分支會產生兩個。

4.5.13未完成的工做

  • 多週期指令
  • 與存儲系統的接口

4.6 小結

重點

  1. 第六週:學習任務教材 第四章
  2. 本章內容是處理器體系結構,重點掌握ISA,並能觸類旁通;本章帶着你們設計並實現了一個結合CISC和RISC思想的處理器Y86,一個類IA32體系的處理器;ISA在編譯器編寫者和處理器設計者之間提供了一個抽象。
  3. 本章重點是4.1-4.3,流水線部分4.4-4.5供學有餘力的同窗自學
  4. 練習題: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

實驗樓實驗

過程

  1. 構建YIS環境:
    cd ~/Code/shiyanlou_cs413
    wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
    tar -xvf sim.tar
    cd sim
    sudo apt-get install tk
    sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
    sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
    make

  2. YIS測試:
    cd y86-code
    進入測試代碼,教材p239頁代碼爲asuml.ys,能夠經過
    make asuml.yo
    進行彙編,asuml.yo就是彙編後的結果,見教材p238。
    make all
    能夠彙編運行全部代碼結果。

遇到的問題

在實驗樓中沒法解析主機地址

還有不太清楚實驗樓中第一項任務的要求。

解決方法:在答疑論壇中看到了同窗的提問和老師的回覆。
實驗樓普通用戶不能聯外網,因此不能夠解析外部的網址,目前外網權限只對會員開放了。老師在實驗樓工做人員的幫助下,已經修改了實驗指導書,把外網地址改爲內網地址了。

參考資料

  1. 教材:第四章《處理器體系結構》,詳細學習指導:http://group.cnblogs.com/topic/73069.html
  2. 課程資料:https://www.shiyanlou.com/courses/413 實驗五,課程邀請碼:W7FQKW4Y
  3. 教材中代碼運行、思考一下,讀代碼的學習方法:http://www.cnblogs.com/rocedu/p/4837092.html
  4. 鼓勵本身好好讀書的連接,但說是入門級的書,但是我仍是東西不少都看不懂:http://www.cnblogs.com/JeffreyZhao/archive/2009/11/23/recommended-reading-3-csapp.html
  5. 無心中翻到的一個程序員的故事:http://mindhacks.cn/2009/05/17/seven-years-in-nju/

感悟

  1. 遇到問題後我用過百度用各類方式查找實驗的問題,在不一樣的電腦上測試,果真仍是答疑論壇最管用了。。。
  2. markdown真的很方便。
  3. 不少人說這本書是入門級教程,可是仍是以爲不容易看懂。
相關文章
相關標籤/搜索