20145213《信息安全系統設計基礎》第六周學習總結上篇


20145213《信息安全系統設計基礎》第六周學習總結上篇

黃色的林子里有兩條路,
很遺憾我無法同時選擇兩者
身在旅途的我久久站立
對着其中一條極目眺望
直到它蜿蜒拐進遠處的樹叢。
我選擇了另外的一條,
它充滿荊棘,需要開拓,
顯得更為誘人。
然而這樣的路過
並未引起太大的改變。
許多許多年以后:
我將輕輕嘆息,敘述這一切
林子里有兩條路,我——
選擇了行人稀少的那一條
它改變了我的一生。

小生有惑

復習到現在,有一些迷茫,我發現我對這個課程並不是很感興趣,進而延伸到,我對我現在這個專業信息安全都不是很感冒。當初報考的時候,我覺得信息安全這個專業很神秘,如今窺其廬山面目后,又覺得不如想象中有趣,現在懊悔當初為什么不報中文系,每天寫寫優美的文字,閑情雅致,不亦樂乎?然逝者如斯夫,飛出去的紙飛機終究回不到手心,還是好好活在當下吧,只是偶爾深夜喟嘆大學四年的光陰學的不是自己最喜歡的知識有點感傷罷了。

小生有貨

  1. Y86指令集體系結構
    (1)內容
    定義一個指令集體系結構,包括定義各種狀態元素、指令集和它們的編碼、一組編程規范和異常事件處理。
    (2)程序員可見狀態
    概念:Y86程序中的每條指令都會讀取或修改處理器狀態的某些部分,稱之為處理器可見狀態。
    Y86處理器狀態類似於I32。可以訪問和修改程序寄存器、條件碼、程序計數器和存儲器,狀態碼指明程序是否運行正常。
RF:程序寄存器    %eax,%ecx,%edx,%ebx,%esi,%edi,%esp(出棧、入棧、調用和返回指令作為棧指針),%ebp
CC:條件碼      ZF、SF、OF(都是一位條件碼,用來保存最近的算術或邏輯指令所造成影響的有關信息。)
PC:程序計數器    存放當前正在執行的指令
DMEM:存儲器    很大的字節數組,保存着程序和數據。Y86程序用虛擬地址來引用存儲器位置。
Stat:程序狀態碼  它表明程序執行的總體狀態。它會指示是正常運行還是出現了某種異常。```
(3)Y86指令
IA32指令集的一個子集,只包括四字節整數操作。尋址方式比較少,操作也比較少。
指令編碼長度從1個字節到6個字節不等,一條指令含有一個單字節的指令指示符,可能含有一個單字節的寄存器指示符,還可能含有一個四字節的常數字。字段fn指明是某個整數操作(OPL)、數據移動條件(cmovXX)或是分支條件(jXX)。所有數值都用十六進制表示
IA32的movl指令分成了4個不同的指令:irmovl、rrmovl、mrmovl和rmmovl。分別顯示地指明源和目的的格式。
源操作數:   立即數i、寄存器r、存儲器m
目的操作數:  寄存器r、存儲器m```

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

4個整數操作指令
addl、subl、andl、xorl
7個跳轉指令(jXX)
jmp、jle、jl、je、jne、jge、jg
有6個條件傳送指令(cmovXX)
cmovle、cmovl、cmove、cmovne、cmovge、cmovg
只有當條件碼滿足所需要的約束時,才會更新目的寄存器的值。
call指令將返回地址入棧,然后跳到目的地址。ret指令從這樣的過程調用中返回。
pushl和popl指令實現了入棧和出棧。
halt指令停止指令的執行。對於Y86來說,執行halt指令會導致處理器停止,並將狀態碼設置為HLT。

(4)指令編碼
每條指令的第一個字節表明指令的類型。這個字節分為兩個部分,每部分4位:高4位是代碼部分,低4位是功能部分。功能值只有在一組相關指令共用一個代碼時才有用。

- 整數操作里代碼部分均為6,功能部分區分addl,subl,andl,xorl
- 分支指令里代碼部分均為7
- 傳送指令里代碼部分均為2```
8個程序寄存器中每個都有相應的0~7的寄存器標識符。
程序寄存器存在一個寄存器文件中,這個寄存器文件就是一個小的、以寄存器ID作為地址的隨機訪問存儲器。當需要指明不應訪問任何寄存器時,用ID值0xF表示。
有的指令沒有寄存器操作數(分支指令和call指令),就沒有寄存器指示符字節。
只需要一個寄存器操作數的指令(irmovl、pushl、popl),將另一個寄存器指示符設為0xF。
有的指令需要一個附加的4字節常數字,可作為:irmovl的立即數數據,rmmovl和mrmovl的地址指示符偏移量,分支指令和調用指令的目的地址。
注意:
- 分支指令和調用指令的目的地址是一個相對地址,而不是相對尋址方式。
- 所有整數采用小端法編碼。當指令按反匯編格式書寫時這些字節就以相反的順序出現。
指令集的一個重要性質就是字節編碼必須有唯一的解釋。這個性質保證了處理器可以無二義性地執行目標代碼程序。即使代碼嵌入在程序的其他字節中,只要從序列的第一個字節開始處理,我們仍然可以很容易地確定指令序列。反過來說,如果不知道一段代碼序列的起始位置,我們就不能准確地確定怎樣將序列划分成單獨的指令。

(5)Y86異常
Y86狀態碼
出現異常時Y86處理器停止運行指令。可以調用一個異常處理程序使其更完整。
(6)Y86程序
Y86代碼與IA32代碼的主要區別:
Y86可能需要多條指令來執行一條IA32指令所完成的功能。
Y86沒有伸縮尋址模式。
命令指明應該將代碼或數據放在什么位置,以及如何對齊。這個程序詳細說明了棧的放置、數據初始化、程序初始化和程序結束等問題。
以“.”開頭的詞是匯編命令,他們告訴匯編器調整地址,以便在那兒產生代碼或插入一些數據。
創建Y86代碼的唯一工具是匯編器。

指令集模擬器YIS   
- 目的:模擬Y86機器代碼程序的執行,而不用試圖去模擬任何具體處理器實現的行為。
- 有助於在實際硬件可用之前調試程序,也有助於檢查模擬硬件或者在硬件上運行程序的結果。
(7)一些Y86指令的詳情
大多數Y86指令是以一種直接的方式修改程序狀態的。
執行pushl和popl指令時,處理器的行為是不確定的,因為要入棧的寄存器會被同一條指令修改。通常有兩種約定:
- 壓入/彈出%esp的原始值
- 壓入/彈出%esp-/+4后的值
2. 邏輯設計和硬件控制語言HCL
要實現一個數字系統需要三個主要的組成部分:
  • 計算對位進行操作的函數的組合邏輯
  • 存儲位的存儲器元素
  • 控制存儲器元素更新的時鍾信號```
    (1)邏輯門
    邏輯門產生的輸出,等於它們輸入位值的某個布爾函數。
AND     &&
OR      ||
NOT     !
邏輯門只對單個位的數進行操作,而不是整個字。
邏輯門總是活動的,一旦一個門的輸入變化,在短時間內,輸出就會跟着變化。

(2)組合電路和HCL布爾表達式
將邏輯門組合成一個網,構建計算塊(組合電路)的限制

兩個以上的邏輯門的輸出不能連接在一起,否則可能使線上信號矛盾,導致一個不合法的電壓或電路故障。
這個網必須是無環的,否則會導致網絡計算有歧義。
組合邏輯電路和c語言中邏輯表達式都是用布爾操作來對輸入進行計算的函數。
區別:
- 組合電路的輸出會持續地響應輸入變化,c語言表達式只有在執行過程中被遇到才求值
- C的邏輯表達式允許參數是任意整數,0是FALSE,其他任何值0的都是TRUE,邏輯門只對位值0和1操作。
- C的邏輯表達式可能被部分求值(第一個參數就能確定結果的就不會對第二個求值)

(3)字級的組合電路和HCL整數表達式
執行字級計算的組合電路根據輸入字的各個位,用邏輯門來計算輸出字的每個位。
所有字級的信號都聲明為int,不指定字的大小。
畫字級電路時,中等粗度的線來表示攜帶字的每個位的線路,用虛線來表示布爾信號結果。
多路復用函數用情況表達式來描述

通用格式:
[
   select_1(布爾表達式):expr_1(整數表達式)
   select_2:expr_2
    ......
   select_k:expr_k
]
  • 從邏輯上講,這些選擇表達式是順序求值的。
  • 第一個求值為1的情況會被選中
  • 選擇表達式允許不互斥
    選擇表達式可以是任意的布爾表達式,可以有任意多的情況。
    組合邏輯電路可以設計成在字級數據上執行許多不同類型的操作。
    (4)集合關系
    判斷集合關系的通用格式:
iexpr in {iexpr1,iexpr2,...,iexprk}
  • 被測試的值iexpr和帶匹配的值iexpr1~iexprk都是整數表達式。
    (5)存儲器和時鍾
    時序電路:有狀態,且在這個狀態上進行計算的系統。
    時序電路的兩類存儲器設備
- 隨機訪問儲存器(儲存器):儲存多個字,用地址選擇該讀/寫哪個字。
硬件和機器級編程中的寄存器有細微差別,分為稱為“硬件寄存器”和“程序寄存器”。
Y86處理器會用時鍾寄存器保存程序計數器PC,條件代碼CC和程序狀態Stat。
處理器有一個隨機訪問存儲器來存儲程序數據。

處理器還包括另外一個只讀存儲器,用來讀指令。
在大多數實際系統中,這兩個存儲器被合並為一個具有雙端口的存儲器:一個用來讀指令,一個用來讀或寫數據。
3. Y86的順序實現
SEQ 順序處理器
每個時鍾周期上,SEQ執行一條完整指令所需的所有步驟
(1)將處理組織成階段
六個基本階段

- 取指        從存儲器讀取指令字節,地址為程序計數器PC的值
- 譯碼        從寄存器讀入最多兩個操作數,得到valA或valB
- 執行        算術/邏輯單元要么執行指令指明的操作,計算存儲器引用的有效地址,要么增加或減少棧指針。得到的值為valE。
- 訪存        將數據寫入存儲器,或從存儲器中讀出數據,讀出的值為valM。
- 寫回        最多可以寫兩個結果到寄存器文件
- 更新PC      將PC設為下一條指令的地址
各類指令及其階段

(2)SEQ階段的實現
取指階段
以PC為第一個字節的地址,一次讀6個字節。

icode   控制邏輯塊計算指令
ifun    功能碼
三個一位的信號(根據icode值計算)

instr_valid     發現不合法的指令
need_regids     包含寄存器指示符字節嗎
need_valC       包括常數字嗎

后五個字節是寄存器指示符字節和常數字的組合編碼。
譯碼和寫回階段
都需要訪問寄存器文件,根據四個端口的情況,判斷應該讀哪個寄存器產生信號valA、valB。
寄存器文件,支持同時進行兩個讀和兩個寫,每個端口有一個地址連接(寄存器ID)和一個數據連接(32根線路),既可以作為寄存器文件的輸出字,又可以作為他的輸入字。
執行階段
包括算數/邏輯單元(ALU),輸出為valE信號。
ALU通常作為加法器使用
每次運行產生:
零、符號、溢出、產生信號set_cc
訪存階段
讀或者寫程序數據。
兩個數據塊產生存儲器地址和存儲器輸入證據的值,兩個產生控制信號表明應該是讀還是寫。當執行讀操作時,數據存儲器產生valM。
根據icode,imem_error,instr_valid,dmem_error,從指令執行的結果計算狀態碼Stat。
更新PC階段
產生程序計數器的新值,依據指令的類型和是否要選擇分支,新的PC可能是valC、valM或者valP。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM