2017-2018-1 20155303 《信息安全系統設計基礎》第七週學習總結

2017-2018-1 20155303 《信息安全系統設計基礎》第七週學習總結

————————CONTENTS————————


學習過程當中遇到的問題和解決

  • 『問題一』

課本中涉及到了許多Y86-64彙編程序與x86-64彙編程序的比較,如何安裝Y86模擬器,並生成彙編程序呢?html

  • 『問題一解決』

1.安裝bison和flex詞法分析工具:git

2.在http://csapp.cs.cmu.edu/public/students.html地址下載sim並解壓。編程

3.安裝tcl/tk:ubuntu

4.修改Makefile文件(sim文件夾下的):安全

  • 首先肯定tk.h和tcl.h在本身虛擬機的什麼位置:

  • 按以下所示進行修改:

其中,最後一行的路徑即爲剛纔查詢的位置。網絡

5.接下來使用make命令編譯便可。多線程

『注意』併發

編譯時可能會出現如下提示:app

這時,須要先make clean,再make函數

6.成功編譯後,使用cat命令查看Y86-64的彙編程序:

7.咱們能夠打開模擬器,使其進行更爲直觀的演示。以pipe文件夾爲例,注意到文件夾下有一個名爲「psim」的可執行文件,輸入./psim -t -g ../y86-code/asum.yo便可打開模擬器:

點擊「Go」按鈕,下方的「取指階段」、「譯碼階段」、「執行階段」和「存儲階段」就會一步一步顯示其變化,最下面的寄存器堆還能夠查看各個寄存器的存儲狀況。

  • 『問題二』

課本P246圖4-2展現了Y86-64指令集,在後面的學習中也常常須要查看並分析這個圖表。在這裏藉助圖4-2簡要分析一下Y86-64的指令,爲後續學習打下基礎。

  • 『問題二解決』

閱讀上圖須要注意如下幾個方面:

1.圖中左邊是指令的彙編碼錶示,右邊是字節編碼

2.指令的編碼長度從1個字節到10個字節不等。一條指令含有一個單字節的指令提示符,可能含有一個單字節的寄存器指示符,還可能含有一個8字節的常數字。

3.字段fn指明是某個整數操做(Opq)、數據傳送條件(cmovXX)或是分支條件(jXX)。

4.每條指令的第一個字節代表指令的類型。這個字節分爲兩部分,每部分4位:高4位是代碼(code)部分,低4位是功能(function)部分。功能碼以下:

5.15個程序寄存器中每一個都有一個相對應的範圍在0到0xE之間的寄存器標識符(register ID)。當須要指明不該該訪問任何寄存器時,就用ID值0xF表示。

  • 『問題三』

課本P259提到了字集的多路複用器電路,是如何實現多路複用的呢?

  • 『問題三解決』

查閱資料瞭解到,多路複用是指以同一傳輸媒質(線路)承載多路信號進行通訊的方式。各路信號在送往傳輸媒質之前,需按必定的規則進行調製,以利於各路已調信號在媒質中傳輸,並不致混淆。

如上圖所示,這個電路根據控制輸入位s,產生一個64位的字Out,等於兩個輸入字A或者B之中的一個。這個電路由64個相同的子電路組成,每一個子電路的結構都是一個位級多路複用器。

能夠觀察到,這個字級的電路只產生一次!s,而後在每一個位的地方都重複使用它,以此減小反處理器和非門的數量。

  • 『問題四』

What is register file

  • 『問題四解決』

register file的概念不難理解。register file是CPU中多個寄存器組成的陣列,一般由快速的靜態隨機讀寫存儲器(SRAM)實現。這種RAM具備專門的讀端口與寫端口,能夠多路併發訪問不一樣的寄存器。

register file有兩個讀端口(A和B),還有一個寫端口(W)。這樣一個多端口隨機訪問存儲器容許同時進行多個讀和寫的操做。如上圖所示的register file中,電路能夠讀兩個程序寄存器的值,同時更新第三個寄存器的狀態。每一個端口都有一個地址輸入,代表該選擇哪一個程序寄存器,另外還有一個數據輸出或對應該程序寄存器的輸入值。

向寄存器文件寫入字是由時鐘信號控制的,控制的方式相似於將值加載到時鐘寄存器。每次時鐘上升時,輸入valW上的值會被寫入輸入dstW上的寄存器ID指示的程序寄存器。

返回目錄


教材部分習題分析

  • 『P248練習題4.2』

肯定下列每一個字節序列所編碼的Y86-64指令序列。若是序列中有不合法的字節,指出指令序列中不合法值出現的位置。每一個序列都先給出了起始地址,冒號,而後是字節序列。

A.
0x100: 30f3fcffffffffffffff |   irmovq $-4,%rbx
0x10a: 40630008000000000000 |   rmmovq %rsi,0x800(%rbx)
0x114: 00                   |   halt
  • 分析:根據「30」找到「irmovq」指令,由指令結構可知接下來的8個字節爲相應的當即數;同理,取40爲「rmmovq」指令;最後的「00」爲中止執行指令。
B.
0x200: a06f                 |   pushl %rsi
0x202: 800802000000000000   |   call proc
0x20b: 00                   |   halt
0x20c:                      | proc:
0x20c: 30f30a00000000000000 |   irmovq $10,%rbx
0x216: 90                   |   ret
  • 分析:此代碼包含函數調用。其他分析方式與A相似,也是根據指令編碼尋找指令;再根據指令的結構選取合適的位數進行切割。因爲此代碼涉及到了系統調用,因此須要有函數的相關信息(proc),如起始地址等。
C.
0x300: 50540700000000000000 |   mrmovq 7(%rsp),%rbp
0x30a: 10                   |   nop
0x30b: f0                   | .byte 0xf0 # invalid instruction code
0x30c: b01f                 |   popq %rcx
  • 分析:此代碼包含非法指令字節0xf0。查詢Y86-64的指令集,咱們並無找到f0對應的指令。

綜上過程,分析過程的大體思路以下:①根據指令編碼的代碼部分和功能部分肯定相應指令;②根據指令的結構肯定所取字節數,以分割字節序列;③另外,須要根據字節數依次類推每一條指令的起始地址。分析時應格外注意非法指令等各類非法狀況。

  • 『P278練習題4.19』

寫出SEQ實現中信號need_valC的HCL代碼。

下圖爲SEQ的取指階段,以PC做爲起始地址,從指令內存中讀取10個字節。根據這些字節,咱們產生出各個指令字段。

根據課本上的提示咱們能夠知道,need_valC的HCL描述能夠肯定指令是否包含一個常數字。

再根據Y86-64指令集中對各個指令的功能描述,就能夠肯定哪些有常數字段了。

最終的HCL代碼以下:

bool need_valC = [
    icode in {IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL};
]

返回目錄


代碼託管

返回目錄


學習感悟和思考

  • 本週主要學習教材第四章。這一章講述基本的組合和時序邏輯元素,並展現這些元素如何在數據通路中組合到一塊兒,來執行x86-64指令集的一個稱爲「Y86-64」的簡化子集。同時,教材還提供了模擬器,造成了一種更爲直觀清晰的表達方式,理解起來也更加方便。
  • 學習過程當中從老師那裏獲取了教材的英文版原著,我認爲閱讀原版書籍對於概念的理解有很是大的幫助。就以這周學習爲例,課本上提到了「寄存器文件」,我對這個概念並不熟悉,因而打算查詢資料加深理解。但網上對於「寄存器文件」這個名詞的解釋寥寥無幾,卻頻繁提到另外一個名詞——「寄存器堆(register file)」。我猜想二者應該指的是同一個事物,只能是翻譯的問題。後來去圖書館找到了英文版的原著,果真其中對「寄存器文件」的描述也爲「register file」。由此看來,對於一些經典的外文書籍,因爲不一樣的翻譯者的翻譯可能千差萬別,因此仍是應該儘可能閱讀原版書籍,以獲取最權威最正宗的解釋。
  • 隨着本學期學習進度的不斷推動,愈加感覺到《深刻理解計算機系統》這本書的經典所在。章節與章節之間,甚至是學科與學科之間千絲萬縷的聯繫,都在這本教材中充分展示出來。操做系統、彙編語言程序設計、Verilog描述、網絡編程等等知識,在這門課程中均有所體現,且更深入,更詳細,更具應用價值。且不談前幾周接觸的進程線程與咱們「操做系統」課程的部分知識幾乎徹底契合,單是這周學習的第四章就讓我又撿起了好多以前學過又近乎忘記的知識,好比各個彙編指令的功能,好比硬件描述語言。就像婁老師強調的,這本書是一本將計算機軟件和硬件理論結合講述的經典教程,一個學期的時間毫不可能所有理解透徹;即便細細讀徹底書,隨着知識體系的不斷擴充,第二次第三次打開時仍會有全新的、更加深入地理解。其實對於其餘經典書籍也是同樣的道理,書是死的,但人的思想是活的,咱們始終強調lifelong-learning,緣由或許就在於,咱們能夠藉助時間的力量,讓靜態的圖書的價值,動態地發揮到極致。

返回目錄


學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 20篇 400小時
第一週 50/50 1/1 8/8 瞭解計算機系統、靜態連接與動態連接
第三週 451/501 2/3 27/35 深刻學習計算機算術運算的特性
第四周 503 / 1004 1/4 20/55 掌握程序崩潰處理、Linux系統編程等知識,利用所學知識優化myod,並實現head和tail命令
第五週 315 / 1319 3/7 29/84 掌握「進程」的概念,並學習應用相關函數;瞭解程序如何在機器上表示
第七週 264 / 1583 1/8 15/99 瞭解處理器的體系結構,學習多線程的概念

返回目錄


參考資料

相關文章
相關標籤/搜索