1. 程式人生 > >20155318 《信息安全系統設計基礎》第十四周學習總結

20155318 《信息安全系統設計基礎》第十四周學習總結

不足 隨著 gid 知識 安全系統 處理 push 信息安全 進度

20155318 《信息安全系統設計基礎》第十四周學習總結

  • 找出全書你認為學得最差的一章,深入重新學習一下,要求(期末占5分):
  • 總結新的收獲
  • 給你的結對學習搭檔講解或請教,並獲取反饋

  • 我選擇教材第四章《處理器體系結構》 的內容來深入學習,在之前的學習中,由於各種原因,對那一章的教材學習和實踐學習都有欠缺,這裏決定重新學習一下。該章主要講解了如下幾個方面的問題:
  1. Y86-64指令集體系結構
  2. 邏輯設計和硬件控制語言HCL
  3. Y86-64的順序實現
  4. Y86-64的流水線實現

基本知識

  • 處理器:執行一系列指令完成相應功能
  • 指令體系結構:處理器支持的指令和指令的字節級編碼
  • 指令集在機器型號上有著一定要求(不同型號相互兼容)
  • 通過處理多條指令的不同部分(流水線)提高性能

Y86-64指令集體系結構

與x86-64相比,Y86-64指令集的數據類型、指令和尋址方式更少,字節級編碼也比較簡單,機器代碼沒有相應的x86-64代碼緊湊

程序員可見狀態

  • Y86程序中的每條指令都會讀取或者修改處理器狀態的某些部分。這稱為程序員可見狀態
  • 程序員可見狀態為:
    • 15程序寄存器(RF):%rax、%rcx、%rdx、%rbx、%rsp、%rbp、%rsi、%rdi、%r8-%r14(每個程序寄存器存儲一個64位的字)
    • 3個條件碼(CC):ZF、SF、OF,保存著最近的算數或邏輯指令所造成影響的有關信息。
    • 程序狀態(Stat):AOK、HLT、ADR、INS,表明程序執行的總體狀態
    名字 含義
    AOK 正常操作
    HLT 遇到器執行halt指令
    ADR 遇到非法地址
    INS 遇到非法指令
    • 程序計數器(PC):存放當前正在執行指令的地址
    • 內存(DMEM)
  • 指令模擬器,稱為YIS,他的目的是模擬Y86-64機器代碼程序的執行,而不用試圖模擬任何具體處理器實現的行為

Y86-64指令

  • 是x86-64指令集的一個子集,尋址方式較少,操作數也較少

技術分享圖片

  • halt:該指令占1個字節,用十六進制表示為「00」,用於停止指令的執行
  • nop:該指令占1個字節,用十六進制表示為「10」,占位指令
  • movq:第一個字母就表明了源的類型,第二個字母指明了目的的類型
    • irmovq V rB:該指令占10個字節,用十六進制表示為「30 FrB V」,將立即數V放入寄存器rB中
    • 技術分享圖片

    • rrmovq rA,rB:該指令占2個字節,用十六進制表示為「20 rArB」,指令作用是將rA寄存器中的值放入rB寄存器中
    • 技術分享圖片

    • .mrmovq D(rB),rA:該指令占10個字節,用十六進制表示為「50 rArB D」,將以“rB+D”為地址的內存單元中的數放入寄存器rA中
    • 技術分享圖片

    • rmmovq rA,D(rB):該指令占10個字節,用十六進制表示為「40 rArB D」,將rA寄存器中的值放入以“rB+D”為地址的內存單元中
    • 技術分享圖片

兩個內存傳送指令中的存儲器引用方式是簡單的基址和偏移量形式。在地址計算中,我們不支持第二變址寄存器和任何寄存器值的伸縮。不允許從一個內存地址直接傳送到另一個內存地址。也不允許將立即數傳送到內存

  • OPq rA,rB:整數操作指令(4個),將寄存器rA和寄存器rB中的值做整數運算,並把結果存入rB寄存器中
    • addq
    • subq
    • andq
    • xorq
      技術分享圖片
  • jXX Dest:跳轉指令(7個),跳轉到以Dest為地址的代碼處,該指令占9個字節
    • jmp
    • jle
    • jl
    • je
    • jne
    • jge
    • jg
      技術分享圖片
  • cmovXX rA,rB為條件傳送指令(6個),其指令格式同rrmovq指令,不同點是只有當條件碼滿足需要的約束時才會更新目的寄存器的值。該指令占2個字節
    • cmovle
    • cmovl
    • cmove
    • cmovne
    • cmovge
    • cmovg
  • call Dest指令:將返回地址入棧,然後跳到Dest指向的目的地址
    技術分享圖片

  • ret指令:從call指令的調用中返回。
    技術分享圖片

  • pushq rA:入棧指令,將rA寄存器中的值壓入棧頂
  • popq rA:出棧指令,將棧頂元素彈出到rA寄存器中
    技術分享圖片

指令編碼

  • 每條指令的第一個字節表明指令的類型。這個字節分為兩個部分,每部分4位:
    • 高4位:代碼部分
    • 低4位:功能部分(功能值只有在一組相關指令共用一個代碼時才會有用)
  • 指令的字節級編碼規則:每條指令的第一個字節表明指令的類型。分為兩個部分,高4位是代碼部分,低4位是功能部分。代碼值為0~0xB,功能值只有在一組相關指令共用一個代碼時才有用。
  • 15個程序寄存器當中,每個都有一個相對應的0~0xE之間的寄存器標識符。
  • 程序寄存器存在CPU中的一個寄存器文件中,這個寄存器文件就是一個小的、以寄存器ID作為地址的隨機訪問存儲器。
  • 分支指令和call指令,就沒有寄存器指示符字節。
  • 只需要一個寄存器操作數的指令(irmovq、pushq、popq)將另一個寄存器指示符設為0xF。
  • 指令集的一個重要性質就是字節編碼必須有唯一的解釋。

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

為實現一個數字系統需要三個主要的組成部分:

  • 計算對位進行操作的函數的組合邏輯
  • 存儲位的存儲單元
  • 控制存儲器單元更新的時鐘信號
邏輯門
  • 是數字電路的基本計算單元
  • 輸出=輸入位值的某個布爾函數。
  • 只對單個位的數進行操作,而不是整個字
  • 對應HCL表達式

    1. AND:&&
    2. OR:||
    3. NOT:!
  • 邏輯門總是活動的,一旦輸入變化,極短的時間內,輸出就會相應變化

組合電路和HCL布爾表達式

HCL中多路復用函數是用情況表達式來描述的,其通用格式如下:

[
    select 1 : expr 1
    select 2 : expr 2
    .
    .
    .
    select k : expr k
]

select i表示第i種情況的布爾表達式(表明什麽時候選擇這種情況),expr i表示在這種情況下的表達式(表明得到的值)。

  • 用情況表達式來描述下圖字級多路復用選擇電路為:

    word Out = [
    s: A;
    1: B;//選擇表達式為“1”,表示如果前面沒有情況被選中,那就選擇這種情況
    ];
  • 很多邏輯門組合成一個網構建的計算塊。註意兩個或多個輸出不能連接在一起,並且必須無環。
  • HCL表達式與C語言中的表達式的區別如下:
    1. 由於組合電路是由一系列的邏輯門組成。HCL中輸出會持續隨著輸入變化而變化。而C語言中只有在程序執行到的時候才進行求值。
    2. C語言中,0是FLASE,除了0以外的所有整數都是TRUE,而HCL只對0和1操作。
    3. C中&&和||這兩種,是優先求值,(&和|並不是)第一個值就能確定結果的話,它不會去計算第二個值。但是HCL中並沒有這樣的規則。
  • HCL中,將所有字級的信號都聲明為int,不指定字的大小,HCL允許比較字是否相等

  • 多路復用函數是用情況表達式來描述的。與C不同其不要求不同的選擇表達式之間互斥
  • 組合電路從本質上講,不存儲任何信息。他們只是簡單地響應輸入信號,產生屬於輸入的某個函數的輸出。

存儲器和時鐘
  • 時序電路:有狀態並在這個狀態上進行計算的系統
  • 時鐘寄存器:存儲單個位或字,時鐘信號控制寄存器加載輸入值
  • 隨機訪問存儲器(存儲器)存儲字,用地址來選擇該讀或該寫那個字。
  • 寄存器作為電路不同部分中的組合邏輯之間的屏障,每當每個時鐘到達上升沿的時候,值才會從寄存器的輸入傳送到輸出
集合關系

我們可以用下面這種形式簡化的表示集合關系:

iexpr in {iexpr1,iexpr2,…,iexprk}//iexpr為被測試的值,iexpr1~iexprk位待匹配的值,他們均為整數表達式
Y86的順序實現
  • 處理一條指令包括很多的操作。將他們組織成某個特殊的階段序列,即使指令的動作差異很大,但所有的指令都遵循統一的序列。
    六個階段內執行的操作:
    • 取指:取指階段從存儲器讀取指令字節,地址為程序計數器(PC)的值。
    • 譯碼:譯碼階段從寄存器文件讀入最多兩個操作數,得到val A/val B.
    • 執行:執行階段,算術/邏輯單元要麽執行指令明確的操作(根據ifun的值),計算存儲器引用的有效地址,要麽增加或減少棧指針。得到的值稱為valE
    • 訪存:訪存階段可將數據寫入存儲器或從存儲器讀出數據
    • 寫回:最多可寫兩個結果到存儲器。
    • 更新PC:將PC設置成下一指令的地址。
  • 處理器無限循環,執行這些階段,在簡化的實現中,一旦發生任何異常,處理器就會停止。
    技術分享圖片

  • 程序計數器放在寄存器中,位於左下角PC。
  • 信息隨著線流動,方向是先向上再向右
  • 反饋先祖在右邊向下
  • 所有硬件單元的處理都在一個時鐘周期內完成。
  • 淺灰色方塊表示硬件單元
  • 控制邏輯塊是用灰色圓角矩形表示的
  • 線路的名字在白色橢圓中說明
  • 寬度為字長或更窄的數據連接用細線
  • 單個位的連接用虛線。

SEQ的時序
  • SEQ的實現包括組合邏輯和兩種存儲器設備:
    1. 時鐘寄存器、程序計數器和條件碼寄存器,隨機訪問存儲器。
    2. 程序計數器、條件碼寄存器。數據內存和寄存器文件。
      技術分享圖片
  • SEQ階段的實現:
    1. 取指階段(包括指令內存硬件單元):以PC為第一個字節的地址,一次從內存讀10個字節。根據icode的值我們可以確定下面三個一位的信號:

      instr_valid:用於發現不合法的指令
      need_regids:是否包含寄存器指示符字節
      need_valC:是否包括常數字
    2. 譯碼和寫回階段:寄存器文件有四個端口,支持同時進行兩個讀和兩個寫。每個端口有一個地址連接(寄存器ID)和一個數據連接(64根線路),既可以作為寄存器文件的輸出字,又可以作為它的輸入字。
    3. 執行階段:包括算數/邏輯單元(ALU),輸出為valE信號。
    4. 訪存階段:讀或者寫程序數據。兩個控制塊產生內存地址和內存輸入數據的值。另外兩個塊產生表明應該執行讀還是寫操作的控制信號。當執行讀操作時,數據內存產生valM。
    5. 更新PC階段:SEQ的最後一個階段會產生程序計數器的新值,依據指令的類型和是否要選擇分支,新的PC可能是valC、valM或者valP。

流水線
  1. 由時鐘信號控制,使多條指令不同階段可以同時執行,增加了延遲,提升吞吐量
  2. 問題:流水階段長度不一,流水線深度過大插入寄存器影響性能
  3. 因為存在反饋的流水線(即一條指令可能需要多次執行某個操作,或使用某個數據,訪問某個存儲器或寄存器)導致流水線冒險(數據,控制)
  4. 數據冒險解決方案:暫停(系統判斷是否會產生冒險,會則插入氣泡,延遲下條指令執行),轉發(使產生的結果理解送入需要的位置,避免暫停),加載\使用(當存儲器讀發生較晚時需要暫停和轉發機制同時使用)
  5. 異常處理
  6. 控制邏輯和機制
    • 處理return:暫停流水線直到ret指令到達寫回階段
    • 加載/使用冒險:在對存儲器讀和使用之間需要暫停一個周期
    • 預測錯誤分支:當預測失敗時應該可以返回到之前狀態,去掉錯誤指令
    • 異常:出現異常時,停止後序指令執行,並避免當前異常指令寫回
  7. 性能分析
    • CPI=1+處罰項(預測錯誤+返回+暫停)
    • 目標:使CPI=1;一個周期執行一條指令

教材習題學習

  • 4.2
  • 確定下列每個字節序列所編碼的Y86-64指令序列。如果序列中有不合法的字節,指出指令序列中不合法值出現的位置。每個序列都先給出了起始地址,冒號,然後是字節序列。
    技術分享圖片

  • 解析:本題考察“字節序列與Y86-64指令之間的轉換”。此題關鍵要根據“代碼部分”(即指令編碼的前4位)確定其指令編碼長度,從而將一個整體的編碼劃分為不同的指令。
  • A.根據“30”找到“irmovq”指令,由指令結構可知接下來的8個字節為相應的立即數;同理,取40為“rmmovq”指令;最後的“00”為停止執行指令。
  • B.代碼包含函數調用。其余分析方式與A類似,也是根據指令編碼尋找指令;再根據指令的結構選取合適的位數進行切割。由於此代碼涉及到了系統調用,所以需要有函數的相關信息(proc),如起始地址等。
  • C.代碼包含非法指令字節0xf0。查詢Y86-64的指令集,我們並沒有找到f0對應的指令。
  • 4.3
  • 解析:有了iaddq指令,我們可以省去P251頁Y86-64代碼中的第2-3行,直接用iaddq $8,%rdi和iaddq $-1,%rsi兩條指令替換10-11行。
  • 4.4
  • 解析:此題涉及到我們常用的幾種操作:
  • xorq %rax,%rax:用異或來給某個數置零
  • andq %rsi,%rsi: 自身相與來設置條件碼,判斷一個數是否為0
  • 用pushq ……和popq ……來保護某個寄存器中的值
  • 用xorq %r11,%r11和subq %r10,%r11加上跳轉語句jle……來取一個數的絕對值:當前%r11中的值為%r10的值的相反數,如果執行subq %r10,%r11後%r11小於等於0,則說明%r10中的值為正數,絕對值為其本身,如果%r11的值大於0,則說明%r10的值為負,用rrmovq %r11,%r10給%r10取反。
  • 此外,我們還經常用“x∧0”來給一個數置0,用“x∨1”來給一個數置1.
  • 4.9
  • 解析:EXCLUSIVE-OR函數要求兩個位有相反的值

    bool xor = (!a&&b)||(a&&!b);
    (通常信號eq和xor是互補的,一個為1,另一個就為0)
  • 4.10
  • 解析:EXCLUSIVE-OR電路的輸出是位相等值的互補。根據德摩根定律,我們能用OR和NOT實現AND。
  • 4.11
  • 解析:將第二行判斷換成“A<=C:B”或“B<=C:B”,因為進入到第二行的前提是A不是最小的如果在此基礎上A還小於等於C,則說明B是最小的,換個角度思考,如果A不是最小的,那麽B和C中較小的就是最小的;
  • 4.12
  • 解析:這個題除了可以像答案中那樣分每種情況討論,也可以結合“&&”和“||”等符號,將同時輸出“B”的情況連接在一起,如“(A<=B && B<=C) || (C<=B && B<=A) : B;”
  • 4.24
  • 解析:這裏我們要改編dstE的HCL代碼來實現條件傳送指令,其實只需要在rrmovq對應的分支加一個判斷Cnd信號的操作,如下所示:

    int dstE = [
    icode in { IRRMOVQ } && Cnd: rB;
    icode in { IIRMOVL, IOPL } : rB;
    icode in { IPUSHQ, IPOPL, ICALL, IRET } : RESP;
    1 : RNONE; # Don’t need register
    ];
  • 4.47&4.48&4.49題目鏈接
  • 代碼托管

上周考試錯題總結

技術分享圖片

錯題解析:對於E選項,書本P270旁註部分對於jxx命令訪存部分是空著的,因此jxx命令沒有訪存操作
技術分享圖片

錯題解析:對於D選項,書本關於磁盤操作寫道:在任何時刻,所有的讀/寫頭都位於同一個柱面上,因此D選項正確
技術分享圖片

錯題解析:對於C選項,DRAM是動態隨機存儲器。SRAM是靜態隨機存取存儲器,且工作時需要刷新。與動態RAM比,靜態RAM的讀寫速度要快,集成度也較低。

結對及互評

本周結對學習情況

  • 20155227

其他(感悟、思考等)

課程的學習接近尾聲,老師布置的重學自認為學的最差的一章,讓我發現了自己在之前學習中的許多疏漏和不足,,希望通過這周的學習能夠查漏補缺,盡快補齊老師之前所要求的學習內容。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 0/0 1/1 3/3
第二周 100/100 1/2 3/6
第三周 300/400 1/3 4/10
第四周 0/400 2/5 2/12
第五周 25/425 1/6 4/16
第六周 181/606 3/9 10/26
第七周 201/807 2/11 7/33
第八周 -(包括腳本無意義)/6719 2/13 7/40
第九周 396/7115 3/16 4/44
第十周 1160/8275 2/18 4/49
第十一周 135/8410 3/21 5/54
第十三周 317/8727 1/22 8/62
第十四周 105/8832 1/23 5/67

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:5小時

  • 實際學習時間:5小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《深入理解計算機系統V3》學習指導
  • ...

20155318 《信息安全系統設計基礎》第十四周學習總結