20155318 《信息安全系統設計基礎》第十四周學習總結
20155318 《信息安全系統設計基礎》第十四周學習總結
- 找出全書你認為學得最差的一章,深入重新學習一下,要求(期末占5分):
- 總結新的收獲
給你的結對學習搭檔講解或請教,並獲取反饋
- 我選擇教材第四章《處理器體系結構》 的內容來深入學習,在之前的學習中,由於各種原因,對那一章的教材學習和實踐學習都有欠缺,這裏決定重新學習一下。該章主要講解了如下幾個方面的問題:
- Y86-64指令集體系結構
- 邏輯設計和硬件控制語言HCL
- Y86-64的順序實現
- 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語言中的表達式的區別如下:
- 由於組合電路是由一系列的邏輯門組成。HCL中輸出會持續隨著輸入變化而變化。而C語言中只有在程序執行到的時候才進行求值。
- C語言中,0是FLASE,除了0以外的所有整數都是TRUE,而HCL只對0和1操作。
- 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的實現包括組合邏輯和兩種存儲器設備:
- 時鐘寄存器、程序計數器和條件碼寄存器,隨機訪問存儲器。
- 程序計數器、條件碼寄存器。數據內存和寄存器文件。
- SEQ階段的實現:
取指階段(包括指令內存硬件單元):以PC為第一個字節的地址,一次從內存讀10個字節。根據icode的值我們可以確定下面三個一位的信號:
instr_valid:用於發現不合法的指令 need_regids:是否包含寄存器指示符字節 need_valC:是否包括常數字
- 譯碼和寫回階段:寄存器文件有四個端口,支持同時進行兩個讀和兩個寫。每個端口有一個地址連接(寄存器ID)和一個數據連接(64根線路),既可以作為寄存器文件的輸出字,又可以作為它的輸入字。
- 執行階段:包括算數/邏輯單元(ALU),輸出為valE信號。
- 訪存階段:讀或者寫程序數據。兩個控制塊產生內存地址和內存輸入數據的值。另外兩個塊產生表明應該執行讀還是寫操作的控制信號。當執行讀操作時,數據內存產生valM。
更新PC階段:SEQ的最後一個階段會產生程序計數器的新值,依據指令的類型和是否要選擇分支,新的PC可能是valC、valM或者valP。
流水線
- 由時鐘信號控制,使多條指令不同階段可以同時執行,增加了延遲,提升吞吐量
- 問題:流水階段長度不一,流水線深度過大插入寄存器影響性能
- 因為存在反饋的流水線(即一條指令可能需要多次執行某個操作,或使用某個數據,訪問某個存儲器或寄存器)導致流水線冒險(數據,控制)
- 數據冒險解決方案:暫停(系統判斷是否會產生冒險,會則插入氣泡,延遲下條指令執行),轉發(使產生的結果理解送入需要的位置,避免暫停),加載\使用(當存儲器讀發生較晚時需要暫停和轉發機制同時使用)
- 異常處理
- 控制邏輯和機制
- 處理return:暫停流水線直到ret指令到達寫回階段
- 加載/使用冒險:在對存儲器讀和使用之間需要暫停一個周期
- 預測錯誤分支:當預測失敗時應該可以返回到之前狀態,去掉錯誤指令
- 異常:出現異常時,停止後序指令執行,並避免當前異常指令寫回
- 性能分析
- 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函數要求兩個位有相反的值
(通常信號eq和xor是互補的,一個為1,另一個就為0)bool xor = (!a&&b)||(a&&!b);
- 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 《信息安全系統設計基礎》第十四周學習總結