20145330 第6周《信息安全系統設計基礎》

20145330 第6周《信息安全系統設計基礎》

本章內容是處理器體系結構,重點掌握ISA,並能觸類旁通;本章帶着你們設計並實現了一個結合CISC和RISC思想的處理器Y86,一個類IA32體系的處理器;ISA在編譯器編寫者和處理器設計者之間提供了一個抽象。git

教材學習內容總結

  • ISA(指令集體系結構)
    • 一個處理器支持的指令和指令的字節級編碼安全

      4.1 Y86指令集體系結構

  • 有8個程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp
    • 處理器的每一個程序寄存器存儲一個字,寄存器%esp被入棧、出棧、調用和返回指令做爲棧指針
    • 有3個一位的條件碼:ZF、OF、SF
  • Y86指令集
    • movl指令分紅了4個不一樣的指令:irmovl、rrmovl、mrmovl、rmmovl
      • 源和目的:源能夠是當即數(i)、寄存器(r)、存儲器(m)。目的能夠是寄存器(r)、存儲器(m)。
    • 四個整數操做指令,OPI:
      • addl、subl、andl、xorl
      • 它們只對寄存器數據進行操做
      • 這些指令會設置3個條件碼:ZF、OF、SF
    • 7個跳轉指令(jXX):
      • jmp、jle、jl、je、jne、jge、jg
      • 根據分支指令的類型和條件碼的設置來選擇分支
    • 6個條件傳送指令(cmovXX):
      • cmovle、cmovl、cmove、cmovne、cmovge、cmovg
      • 這些指令的格式與rrmovl同樣,可是隻有當條件碼知足所須要的約束時,纔會更新目的寄存器的值
    • call指令將返回地址入棧,而後跳到目的地址。ret指令從這樣的過程調用中返回
    • pushl和popl指令實現了入棧和出棧
    • halt指令中止指令的執行
  • 指令編碼
    • 每條指令須要1-6個字節不等
    • 每條指令的第一個字節代表指令的類型:這個字節分爲兩個部分:高4位是代碼部分、低四位是功能部分
    • 練習習題4.1\4.2
  • Y86異常
    • AOK:正常操做
    • HLT:處理器執行halt指令
    • ADR:遇到非法地址
    • INS:遇到非法指令
  • Y86程序
    • 這個程序中,以「.」開頭的詞是彙編器命令函數

      4.2 邏輯設計和硬件控制語言HCL

  • HCL語言只表達硬件設計的控制部分,只有有限的操做集合。
  • 邏輯門
    • AND:&&
    • OR:||
    • NOT:!
  • 簡單組合電路
    • 習題4.8
  • 多路複用器{MUX)
    • 多路複用器根據輸入控制信號的值,從一組不一樣的數據信號中選出一個
    • 在這個簡單的多路複用器中,兩個數據信號是輸入位a和b,控制信號是輸入位s
    • bool out=(s&&a)||(!s&&b)
  • 字級的組合電路和HCL整數表達式
    • 位級實現
    • 字級抽象
    • bool Eq=(A==B)
  • HCL中,多路複用函數是用狀況表達式來描述的
    • 這個表達式包含一系列狀況,每種狀況i都有一個布爾表達式selecti和一個整數表達式expri,前者代表何時該選擇這種狀況,後者指明的是獲得的值
    • 習題4.10
  • 組合邏輯電路
    • 算數/邏輯單元(ALU)是一種很重要的組合電路
  • 集合關係
  • 存儲器和時鐘
    • 時鐘寄存器(寄存器):存儲單個位或字。時鐘信號控制寄存器加載輸入值。
    • 隨機訪問存儲器(存儲器):存儲多個字,用地址來選擇該讀或該寫哪一個字。
    • 程序計數器(PC)
    • 條件代碼(CC)
    • 程序狀態(Stat)oop

      4.3 Y86的順序實現

  • 將處理組織成階段
    • 取指:取指階段從存儲器讀取指令字節,地址爲程序計數器(PC)的值。
      • icode:指令代碼,ifun:指令功能
    • 譯碼:譯碼階段從寄存器文件讀入最多兩個操做數,獲得值valA/valB
    • 執行:在執行階段,算數/邏輯單元(ALU)要麼執行指令指明的操做 ,計算存儲器引用的有效地址,要麼增長或減小指針。
      • 獲得的值稱爲valE
    • 訪存:訪存階段能夠將數據寫入存儲器,或者從存儲器讀出數據。
      • 讀出的值爲valM
    • 寫會:寫會階段最多能夠寫入存儲器。
    • 更新PC:將PC設置成下一條指令的地址。
  • Y86指令序列(圖4-17)
  • Y86指令OPI、rrmovl、irmovl在順序實現中的計算(圖4-18)
    • 習題4.11
  • Y86指令rmmovl、mrmovl在順序實現中的計算(圖4-19)學習

  • Y86指令pushl和popl在順序實現中的計算(圖4-20)
    • 習題4.12
  • Y86指令jXX、call、ret在順序實現中的計算(圖4-21)
    • 習題4.16
  • SEQ硬件結構
    • 取指:將程序計數器寄存器做爲地址,指令存儲器讀取指令的字節。
    • 譯碼:寄存器文件有兩個讀端口A和B,從這兩個端口同時讀取寄存器值valA、valB
    • 執行:根據指令類型將ALU用於不一樣目的。
    • 訪存:數據存儲器讀入或寫入一個存儲器字。
    • 寫回:寄存器文件有兩個端口
  • SEQ的時序編碼

    Y86模擬器的安裝

  • 構建YIS環境
    • 解壓命令:tar -xvf sim.tar
      .net

    • 進入:cd sim
    • 圖形界面須要安裝Tcl/Tk
      • sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
    • 進行文件的修改(打開文件目錄下的makefile文件夾,用leafpad或者其餘記事本進行修改)
      • GUIMODE=-DHAS_GUI (去掉原有註釋#)設計

      • TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.53d

      • TKINC=-I/usr/include/tcl8.5
        指針

    • 編譯 在sim文件夾下右鍵選擇在終端中打開,輸入make clean;make

代碼調試中的問題和解決過程

YIS

  • 問題:沒有找到下載的sim
  • 解決方法:從新下載記住保存路徑,爲了方便我放在主文件夾下。

  • 問題:找不到psim
  • 解決方法:從新安裝了一遍也並無找到問題所在,因此用實驗樓繼續試驗...

  • 實驗樓也出現了一點問題不過是字母大小寫的緣由。

  • 最終進行彙編,asuml.yo就是彙編後的結果。

    教材學習中的問題和解決過程

  • 4.1
    • 題目:肯定Y86指令序列的字節編碼
      • .pos ox100
      • irmovl $15,%ebx
      • rrmovl %ebx,%ecx
    • 解決方法:比照Y86指令集,irmovl V,rB 爲 30 F rB V
      • 將15化爲十六進制表示爲0x0000000f,以反向順序來寫就是0f000000
      • rrmovl rA rB 爲 20 rA rB
      • 對照寄存器名字與數字,爲2031
      • 答案:0x100:30f30f000000
      • 0x106:2031
  • 4.2
    • 題目:肯定字節序列所編碼的Y86指令序列
      • 0x400:6113730004000000
      • 0x500:6362a0f0
    • 解決方法:先看開始兩個字節判斷指令與功能,分步分析。
      • 0x400:6113| subl %ecx,%ebx
      • 0x402:7300040000| je loop
      • 0x407:00| halt
      • 0x500:6362| xorl %esi,%edx
      • 0x502:a0| pushl
      • 0x503:f0|
  • 4.8
    • 題目:寫出信號xor的HCL表達式,xor就是異或,輸入爲a和b。信號xor和上面定義的eq有什麼關係呢
    • 解決方法:用邏輯門語句。數據類型bool
      • bool xor=(!a&&b)||(a&&!b)
      • 一般,信號eq和xor是互補的。也就是,一個等於1,另外一個等於0
      • bool eq=(a&&b)||(!a&&!b)
  • 4.10
    • 題目:寫一個電路的HCL代碼,對於輸入字A,B,C,選擇中間值。
    • 解決方法:也就是,輸出等於三個輸入中居於最小值最大值中間的那個字
      • 個人思路是會有abc,cba,bac,cab,acb,bca六種狀況,列舉法好了。
      • int Med3=[
        • A<=B&&B<=C:B;
        • C<=B&&B<=A:B;
        • B<=A&&A<=C:A;
        • C<=A&&A<=B:A;
        • 1 :C;
        • ];
  • 4.12
    • 題目:valM=M4[valA]
      • 不清楚這一步具體如何實現
    • 解決方法:由上一步知:valA=124,則M4[124]查看指令序列%esp=124找到這行指令:pushl %edx,知%edx=9
    • 答案:valM=M4[valA]=9

本週代碼託管

  • 託管連接:https://git.oschina.net/20145330swx/Linux

    感悟與思考

  • 本週的內容是按部就班的,要從第一節看到第七節才能比較好的掌握知識,天天學習一點點是良好的學習方法。在進行Y86的安裝時剛開始比較順利後面越是遇到了一些問題,不明白一步步按教程安裝爲何會出現找不着目錄的問題,以後我還會探索。還好有實驗樓讓我完成了實驗。

    學習進度條

代碼行數(新增/累積 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 200/200 2/2 20/20
第二週 300/500 2/4 18/38
第三週 500/1000 3/7 22/60
第四周 000/1000 2/9 30/90
第五週 200/1200 1/10 30/120
第六週 100/1300 1/101 30/150
相關文章
相關標籤/搜索