信息安全系統設計基礎第八週期中總結

信息安全系統設計基礎第八週期中總結

【學習時間:12小時】linux

【學習內容:CHAPTER1——CHAPTER7內容重點;疑問與考試錯題分析;實驗環節難點回顧】web

1、課本章節內容重點

(一)第一章

1.信息就是「位+上下文」。

【理解:信息自己的表示形式是相對固定的,在linux系統內(以及其餘的操做系統內),操做信息、數據信息等都是以二進制形式存儲的;這些二進制位如何理解、怎麼劃分,是靠上下文的要求決定的。兩者聯繫起來組成了「信息」的概念。】正則表達式

2.系統的硬件組成

  • 總線:攜帶信息字節並負責在各個部件之間傳遞;定長的字節塊,即字。字中的字節數(即字長)是一個基本的系統參數。
  • I/O設備
  • 主存,由一組DRAM組成

3.操做系統兩個基本功能:防止硬件被失控的應用程序濫用;嚮應用程序提供簡單一致的機制來控制複雜的低級硬件設備

4.操做系統三個基本抽象:文件<--I/O設備;虛擬存儲器<--主存,磁盤I/O設備;進程<--處理器,主存,I/O設備

(二)第二章

5.gcc -m32 能夠在64位機上生成32位的代碼

6.字節順序的兩種表示方法:小端是「高對高、低對低」,大端與之相反

7.整數表示:負數-1在補碼編碼中,和Umax的編碼同樣(每位都是1)

8.幾乎全部的機器都使用補碼;一般,大多數數字都默認爲有符號.然而,在一個運算式中,若是有一個參數是無符號的 ,那麼另一個也會默認爲無符號數

9.數字截斷:將一個w位的數丟棄前k位獲得的數字(二進制)爲:2^w mod 2^k,有可能發生溢出.

10.補碼的非:除了x=-2^(w-1)和0的非是他們自己以外,其餘數字的非(加法逆元)均可以經過2^w-x得到。

11.C語言中,有符號數字的乘法是經過將2w位截斷爲w位的方式來實現的。即:xy - U2T((xy)mod 2 ^w)

【難點:能夠理解爲,兩個補碼錶示的數字,將它們的二進制表示的無符號數相乘獲得的結果截取前w位;這樣獲得的結果和無符號數乘法的結果一致】算法

12.對於負數除以2^k,咱們能夠用「偏置」來修正不合適的舍入:利用x/y=(x+y-1)/y

13.浮點數構造

IEEE浮點標準——用V= (-1)^sM2^E來編碼一個數。其中:數組

符號:s決定這個數是負數(s=1)仍是正數(s=0),對於數值是0的符號位解釋爲特殊狀況。緩存

尾數:M是一個二進制小數。安全

階碼:E對浮點數加權,能夠是負數。數據結構

【難點:如何把一個十進制數字轉化成浮點數?函數

步驟:將原數用二進制表示出來,左移小數點n位獲得規格化表示;將小數點左側的部分補0構造小數字段;用偏置量加上n獲得的結果用二進制表示出來獲得階碼位,前面加上一位的符號位,組合起來便可】學習

(三)第三章

14.gcc -S xxx.c 能夠獲得C語言編譯器產生的彙編代碼,但不會作其餘工做;使用「-c」命令,GCC就會編譯並彙編該代碼,獲得二進制文件XXX.o。

15.尋址方式的通用公式:有效地址能夠表示爲Imm+R[Eb]+R[Ei]*s。Imm爲當即數偏移;Eb爲基址寄存器;Ei爲變址寄存器;s爲比例因子。如:

1)Ea——操做數值:R[Ea]

2)(Ea)——操做數值:M(R[Ea])【難點:這裏的意思是說,須要將這個存儲單元中的內容做爲地址進行尋址】

3)Imm(Ea)——操做數值:M(Imm+R[Ea])

16.SUB S,D——將D-S的結果送至D

17.SET類指令根據t=a-b的結果所設置的條件碼來將一個字節(目的操做數)設置爲0或者1

18.IA32利用程序棧來支持過程調用(包括將數據和控制)。爲單個過程分配的那部分棧作棧幀。最底端(地址最大)%ebp爲幀指針;最頂端(地址最小)%esp爲棧指針。當程序執行時,棧指針能夠移動。

19.轉移控制——

1)call指令:後接被調用過程的起始的指令地址。效果是將返回地址入棧,並跳轉到被調用過程的起始處。

2)ret指令:從棧中彈出地址,並跳轉到這個位置。

【難點:如何理解?

兩者配合,實現函數調用時的銜接:即,call相似於先行的探險者,將迷宮入口處的地址存到某個安全的地方,而後探索迷宮(函數);ret相似於保障人員,在探險完成以後將該地址取出來,帶領程序回到最初的入口處,接着走大路(主程序)】

(四)

20.Y86

一個簡單的、能夠稱之爲IA32指令集的子集的指令集;只包括四字節整數操做,尋址方式比較少。指令編碼長度從1——6字節不等。指令集的一個重要性只就是字節編碼必須具備惟一的解釋。

關於指令結構,每條指令的第一個字節代表指令的類型;這個字節分爲兩個部分,每部分四位:高四位是代碼部分(0——0xB),第四位是功能部分。這裏補充一些縮寫:當即數(i),寄存器(r)、存儲器(m)。指令附加的寄存器指示符字節依次是數據源(若是是當即數,把這一位設置成0xf)、目的寄存器/基址寄存器。有些指令須要附加四字節的常數字,採用小端法(倒序)編碼

21.pushl會把棧指針減4,並將一個寄存器值寫入存儲器中。所以,執行pushl %esp 和 popl %esp的結果是不固定的。

22.處理操做的階段——

  • 取指:從寄存器讀取指令字節,地址爲程序計數器的值。計算下一條指令地址等於PC中的值加上已取出指令的長度;
  • 譯碼:從寄存器文件中最多讀出兩個操做數,它讀入指令rA和rB指明的寄存器,不過有些是讀寄存器%esp的;
  • 執行:ALU執行指明的操做、引用的有效地址或者是修改棧指針,獲得的值稱爲valE;
  • 訪存:將數據寫入存儲器或者從存儲器讀出數據,讀出的數據叫作valM;
  • 寫回:寫兩個結果到寄存器文件;
  • 更新PC:將PC設置成下條指令地址。

23.關於一些指令的執行階段的說明

  • OPI,rrmovl,irmovl指令在訪存階段是不作操做的;此外,irmovl由於是長指令格式,因此PC要加6;
  • rmmovl,mrmovl在訪存階段要將寄存器值valA吸入存儲器或者從存儲器中讀出valM
  • call指令和ret指令與popl和pushl相似;對於call指令來講,要將valP(緊跟call以後那條指令的地址)壓入棧中

24.SEQ的時序(逐步深化)

  • 要控制處理器中活動的時序,只須要寄存器和存儲器的時鐘控制
  • 除了指令存儲器只用來讀指令故而能夠看做組合邏輯以外,剩餘的程序計數器、條件碼寄存器、數據存儲器和寄存器文件須要經過一個時鐘信號來控制(控制時序)
  • 在每一個時鐘週期內,程序計數器都會裝載新的指令地址;只有執行整數運算指令的時候,纔會裝載條件碼寄存器。只有執行rmmovl,pushl,call時,纔會寫數據存儲器。
  • Y86指令集的本質遵循這樣一項組織原則:處理器歷來不須要爲了完成一條指令的執行而去讀由該指令更新了的狀態 【如何理解?也就是說,處理器所「經手」的指令中,若是有某些是能夠改變機構狀態的;那麼必定先改變狀態以後再執行指令。這樣保證了操做的時序性(防止指令執行起來互相顛倒)】

(三)第六章

25.關於DRAM

  • DRAM的芯片中的單元被分紅d個超單元,每一個超單元都由w個DRAM單元組成。一個d*w的DRAM總共存儲了dw位的信息。超單元被組織成一個r行c列的長方形陣列,這裏rc = d。信息經過引腳的外部鏈接器流入和流出芯片。
  • 每一個DRAM芯片被鏈接到某個稱爲存儲控制器的電路,這個電路能夠一次傳送w位到每一個DRAM芯片或者依次從每一個芯片傳出w位。電路設計者將DRAM組織成二維而不是線性數組的一個緣由是下降芯片上地址引腳的數量。

26.數據流經過總線的共享電子電路在處理器和DRAM之間來回;包括讀事務(從主存到CPU)和寫事務。總線是一股並行的線,能夠攜帶數據、控制信號和地址(數據總線,地址總線,控制總線)。

27.磁盤結構

  • 磁盤是保存大量數據的存儲設備;但讀取速度慢。
  • 磁盤有若干盤片組成,密封在容器(磁盤驅動器)內;每一個盤片的兩個表面都有一組被稱爲磁道的同心圓;每一個同心圓由一些間隙分隔成一組等容量磁道(一般是512字節),間隙中存儲的是標識扇區的格式化位。
  • 柱面:全部盤片表面到主軸中心距離相等的磁道的集合

28.對扇區的訪問主要有三個部分:

- 尋道:將讀寫頭定位到包含目標扇區的磁道上。Tseek取決於它之前的位置和傳動臂在盤面上的移動速度。時間一般爲3——9ms。
- 旋轉:一旦讀寫頭定位到了指望的磁道,驅動器等待目標扇區的第一個位旋轉到讀寫頭下面。平均旋轉時間是最大時間(等磁盤旋轉一圈)
- 傳送:驅動器開始寫或者讀扇區的內容;時間長短取決於旋轉速度和每條磁道的扇區數目。平均時延爲 Tavg=1/RPM*1/(平均扇區數/磁道)*60secs/1min
- 補充:訪問一個磁盤扇區的512字節的主要時間在於尋道和旋轉延遲。訪問時間:磁盤>DRAM>SRAM

29.CPU使用一種稱爲存儲器映射I/O的技術來向I/O設備發出命令的。在使用其的系統中,地址空間中,有一塊地址是爲與I/O設備通訊保留的;叫作I/O端口

30.存儲器層次結構的中心思想是:對於每一個k,位於k層的更快更小的存儲設備做爲位於(k+1)層的更大更慢的存儲設備的緩存。

31.高速緩存存儲器(S,E,B,m)

  • 每一個存儲器地址有m位,造成M=2^m個不一樣地址。這m位被劃分紅t個標記位、s個組索引位和b個塊偏移位。
  • 這樣一個機器的高速緩存被組織成S=2^s個高速緩存組的數組;每一個數組包含E個高速緩存行;每行由一個B=2^b字節的數據塊、一個有效位(指明這個行是否包含有效信息)、t=m-(b+s)個標記位(惟一標識存儲在這個高速緩存行中的塊)組成
  • 高速緩存的大小爲C=SEB

【理解:從高向低來看,M=2^m個地址平均分給S=2^s個組,每組得到2^(m-s)個地址,即(m-s)位;減去t位用於標記塊,還有2^(m-t-s)個地址能夠表示一個塊,也就是說,一個塊能夠有2^(m-t-s)個字節的信息】

32.術語「抖動」描述的是:即,高速緩存反覆地加載和驅逐相同的高速緩存塊的組——解決辦法之一就是在每一個數組末尾加上若干字節的填充。

2、疑問與考試錯題分析

(一)疑問反饋

1.這裏對gcc helloprint.c hellomain.c –o hello的解釋中,最後一個命令的意思是什麼?(猜想:是不是將這兩個.o文件轉換爲一個可執行的,名稱爲hello的文件?)

【解釋:是這樣的,能夠參見下方的步驟分解。】

2.P63:

經過相似的推理,咱們能夠得出,對於一個位模式爲[x(w-1),x(w-2),……,0,……,0]的補碼數x,以及在0<=k<=w範圍內的任一k,位模式爲[x(w-k-1),x(w-k-2),……,0,……,0]就是x*2^k的補碼錶示

爲何截斷前面的k位、後面補上0以後,就是一個乘式結果的補碼錶示?

【解釋:這裏就包括了溢出(即得不到正確結果)的可能性。就是說,這樣操做獲得的結果和實際去乘獲得的結果同樣。】

3.P66練習題2.42

寫一個函數div16,對任何整數參數,返回x/16的值。不能使用四則運算和任何條件運算符、比較運算符。(假設你的機器是32位,使用補碼錶示,右移都是算術右移)

int div16(int x)
{
    int bias = (x>>31)&0xf;//若是是負數,bias就會變成f
    return (x+bias)>>4;
}

不太理解如何證實負數運算時,加上bias(即f)以後就能夠直接右移四位?

【假設x是負數,則加上bias=15以後,就至關於(x+16-1)/16,達到了偏置的效果。】

4.既然leal是mov的變形,那麼全部能夠用leal的場合均可以用mov嗎?

【兩者仍是有區別的;leal指令是將有效地址直接寫到目的寄存器。】

5.P383

有些系統也使用糾錯碼,其中計算機的字會被多編碼幾個位(例如,32位的字可能用38位來編碼),這樣一來,電路能夠發現並糾正一個字中任何單個的錯誤位。

並不明白,這樣先後有什麼因果關係?

【由婁老師進行解釋:奇偶校驗碼即典型應用。】

【補充解釋:奇偶校驗可描述爲:給每個碼字加一個校驗位,用它來構成奇性或偶性校驗。能夠看出,附加碼元d2,是簡單地用來使每一個字成爲偶性的。所以,如有一個碼元是錯的,就能夠分辨得出,由於奇偶校驗將成爲奇性。奇偶校驗編碼經過增長一位校驗位來使編碼中1個個數爲奇數(奇校驗)或者爲偶數(偶校驗),從而使碼距變爲2。】

6.P402

另外一方面,由於sum是標量,對於sum來講,沒有空間局部性。

爲何標量沒有空間局部性?(若是一個存儲位置被引用了一次,那麼程序極可能在不遠的未來被引用附近的一個存儲器位置)

【解釋:就是由於標量只會引用它自己,而不涉及附近位置的量。與此相反,數組等向量就能夠很好地體現空間局部性。】

7.P403

圖6-20中

int sumaraycols(int a[M][N])
{    
    ……
    for(i=0;i<N;j++)
        for(j=0;j<M;j++)
            sum+=a[i][j];
    ……
}

這裏,爲何是"i<N","j<M"?是否是應該對調一下變成"i<M","j<N"?

【這裏我參考了影印版《深刻理解計算機系統》,確認此處就是"i<M","j<N"。】

8.P253

圖4-19顯示了rmmovl和mrmovl在順序實現中的計算。其中在訪存階段,會將寄存器值valA寫到存儲器,或者從存儲器中讀出valM。

爲何要有這個步驟呢?看似並沒有必要。

【婁老師解釋:這兩個指令的功能:rmmovl把寄存器的值寫到內存,mrmove把內存中的數據寫到寄存器,實現上很重要的步驟就是將寄存器值valA寫到存儲器,或者從存儲器中讀出valM,沒這兩個步驟就不能實現兩個指令的功能,是頗有必要的。 】

9.P249

下面的圖展現了一個典型的寄存器文件:……寄存器文件有兩個讀端口,還有一個寫端口。

那麼,「讀」與「寫」都是向這個寄存器中輸入數據嗎?

【解釋:讀 表示 輸出;寫 表示 輸入】

(二)考試錯題分析

1.Linux Bash中, man printf和man 1 printf 功能等價。 (ok)

在linux中,默認man printf便是對linux系統命令中的printf進行操做(調用關於printf的幫助文檔)

2.Linux Bash中,cd - 命令能夠切換到'home'目錄。( x )

應該是cd ~ , cd -是切換到上一個目錄。

3.Linux Bash中,source 和 . 命令功能等價。 (ok)

這兩個都是指的根目錄。

4.Linux Bash中,查找home目錄中前天建立的文件的命令是(find ~ -ctime 2)。

find命令執行查找功能;~表明home目錄(根目錄);ctime 2表明2天前建立的文件(時間點,而不是時間段)。

5.數據結構中有線性查找算法,C標準庫中沒有這個功能的函數,但Linux中有,這個函數是(lfind或lsearch)

能夠用find進行查找

6.連接器的兩個主要任務是(符號解析和重定位)。

7.(加載器)將可執行文件的內容映射到存儲器,並運行這個程序。

8.~/test 文件夾下有不少c源文件,查找main函數在哪一個文件中的命令( grep main *.c )

【grep命令能夠實現篩選的功能,篩選範圍是全部的.c文件。】

9.C語言中: -2147483647-1U < -2147483647 ( ok )

【左側的-2147483647-1在轉換成無符號數的時候,會轉換成(4294967296-2147483648)即2147483648;而-2147483647轉換成無符號數字的時候也是加上4294967296,則比左側大。】

10.把內存中地址爲0x4050處的字複製到地址爲0x405c處的指令是 movw ($0x4050) ,($0x405c) (x)

應該是movw $0x4050 ,($0x405c)

11.C語言中的循環結構能夠用(條件測試和跳轉組合起來)實現。

也就是說,條件測試負責把控循環的進出;而跳轉則是執行循環體。

12.實現一個數字系統須要三組成部分(組合邏輯、存儲器元素、時鐘信號)。

3、實驗環節重點回顧

(一)linux基礎命令

1.Ctrl+d——鍵盤輸入結束或退出終端;Ctrl+s——暫定當前程序,暫停後按下任意鍵恢復運行。

2.touch 命令建立文件。

3.關於man命令的分區:1 通常命令;2 系統調用;3 庫函數,涵蓋了C標準函數庫。能夠經過在 man 後面加上相應區段的數字查看相應段的內容。

4.知道某個命令的做用,只是想快速查看一些它的某個具體參數的做用,那麼你能夠用--help參數,大部分命令都會帶有這個參數。(--help與man的區別就在於前者側重於對命令參數的解釋)

5.在 Linux 系統裏, root 帳戶擁有整個系統至高無上的權利,好比 新建/添加 用戶。默認狀況下在sudo用戶組裏的可使用sudo命令得到root權限。

6.建立新用戶:sudo adduser [用戶名];切換用戶:su -l [用戶名];查看用戶組:groups [用戶];添加用戶組(在sudo組中的用戶纔有此權限):sudo usermod [用戶組參數] [用戶]

7.一個目錄要同時具備讀權限和執行權限才能夠打開,而一個目錄要有寫權限才容許在其中建立其它文件。

8.更改文件全部者:sudo chown [新全部者] [文件];更改文件權限:chmod [全部者權限][同一用戶組用戶權限][其餘權限] [文件]

9.echo [變量名稱]:查看某變量的值

10.cut 命令,打印每一行的某一字段。

注:-d ':'表示以「:」爲分隔符

11.grep命令參數

  • -r 參數表示遞歸搜索子目錄中的文件;
  • -n表示打印匹配項行號;
  • -I表示忽略二進制文件
  • $就表示一行的末尾,通常加在關鍵字後

12.wc(統計並輸出一個文件中行、單詞和字節的數目)經常使用參數:

  • -l:行數
  • -w:單詞數
  • -m:字節的數目

13.簡答的正則表達式使用舉例

(將匹配以'z'開頭以'o'結尾的全部字符串) echo 'zero\nzo\nzoo' | grep 'z.*o'

(將匹配以'z'開頭以'o'結尾,中間包含一個任意字符的字符串) echo 'zero\nzo\nzoo' | grep 'z.o'

(將匹配以'z'開頭,以任意多個'o'結尾的字符串) echo 'zero\nzo\nzoo' | grep 'zo*'

(將匹配全部的數字) echo '1234\nabcd' | grep '[0-9]'

14.擴展正則表達式

  • 一些不便書寫的或有其餘特殊用途的 一些不便書寫的或有其餘特殊用途的 「字符,在前面加 「字符,在前面加 \」 \」 後,就表明該符 後,就表明該符 號自己
  • " " 次數修飾 次數修飾 " " 放在 放在 " " 被修 被修 飾表達式 飾表達式 " " 後邊。如: 後邊。如: "[bcd][bcd]" "[bcd][bcd]" 寫成 寫成 "[bcd]{2}"
  • ^ 與字符串開始的地方匹配,不匹配字符
  • $ 與字符串結束的地方匹配,不匹配字符

(二)GCC、GDB使用

1.gcc編譯步驟

  • gcc -E hello.c -o hello.i
    預處理
  • gcc -c hello.i -o hello.o
    將hello.i編譯爲目標代碼
  • gcc hello.o -o hello
    gcc鏈接器將目標文件連接爲一個可執行文件,一個大體的編譯流程結束

2.編寫用於調試的代碼

執行

3.gdb調試

  1. gcc –g [C源文件] -o [可執行文件]
  2. gdb [可執行文件]
  3. gdb l(列出C代碼) (圖6)
  4. break [行數或其餘]——設置斷點
  5. info break——查看斷點信息
  6. n——單步執行
  7. p [變量]——打印變量的值
  8. finish ——退出函數
  9. c——繼續執行
  10. 部分調試過程截圖

4、總結與建議

(一)不足之處

本次期中總結的過程當中,我發現本身對基礎知識掌握得較爲紮實,然而對linux操做等須要動手實踐的部分的確須要進一步提升——好比,我用在複習課本一章內容的時間並不長,由於每一章的重點在第一遍學習的過程當中已經被我記錄而且經過作題進行了鞏固;而在複習實驗部分時,我卻以爲「溫故而知新」,複習的過程更像是撿起以前不曾注意到或者不曾理解過的知識的過程。於是,在以後的學習中,動手實踐,是我更應該側重的地方。

(二)課程建議

我認爲,起初的「先看書,後講解」的課程學習模式可能對至關一部分同窗來講是有難度的:一是由於課程起步階段大多數同窗不能很快適應,二是對課本把握很差,精力投入的側重也難以把握。現階段,「先講解,再看書,後驗收」的模式(在我看來)能夠糾正以前的問題,促進高效率學習。另外,我以爲,在課上一如既往地堅持和增強對操做性內容的講解,對於我這種「動手能力差」的同窗來講是頗有幫助的。

相關文章
相關標籤/搜索