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

學習目標:(連接是我每週博客中的相應部分和老師發佈的考試答案)html

1.複習Linux命令(信息安全系統設計基礎第一週學習總結),特別是man -k, cheat, grep -nr xxx /usr/include
2.複習vi, gcc, gdb,make的使用(信息安全系統設計基礎第二週學習總結
3.複習教材內容
ch01
ch02(信息安全系統設計基礎第三週學習總結
ch03(信息安全系統設計基礎第四周學習總結
ch04(信息安全系統設計基礎第五週學習總結
ch06(信息安全系統設計基礎第六週學習總結
ch07
4.複習前面的考題(歷次考試答案解析java

1、重要知識點總結

(一)Linux命令

1.man -k

man -k k1 | grep k2 | grep k3 ...
  • 模糊查找,查找含有關鍵字的內容
  • man 中的不一樣區段表明相應的內容,經過限定查找內容的區段,能夠過濾出更簡潔的結果,共有8個區段:linux

    1   Linux中的通常命令
      2   系統調用
      3   庫函數,涵蓋了C語言的標準函數庫
      4   特殊文件(一般是/dev中的設備)和驅動程序
      5   文件格式和約定
      6   遊戲和屏保
      7   雜項
      8   系統管理命令和守護進程
  • 查看某命令在指定區段內的解釋時用法:程序員

    man 區段號 命令

2.cheat

  • 以舉例的方式告訴咱們某個命令或者函數的用法。

3.grep -nr XXX /usr/include

  • 查找某個宏。

4.其它查找方法

- find      通常查找
- locate    急速查找
- whereis   查找文件所在文件夾
- which     查找可執行文件所在文件夾

(二)編譯程序

1.、Vim

(1)六種模式

普通模式
插入模式
可視模式
選擇模式
命令行模式
Ex模式

(2)經常使用命令總結

  • 插入正則表達式

    i       在當前光標處進行編輯
      a       在光標後插入編輯
  • 退出express

    :q!     強制退出,不保存
      :q      退出
      :wq!    強制保存並退出
      :wq     保存並退出
      :w <文件路徑>       另存爲
  • 刪除編程

    x       刪除遊標所在的字符
      dd      刪除整行
  • 行間跳轉vim

    nG(n Shift+g)   光標移動到第n行
  • 複製與粘貼數組

    nyy     複製光標所在及其後的整行共n行
      p       表明粘貼至光標後
  • 功能設定緩存

    :set autoindent(ai)     設置自動縮進
      :set cindent(cin)       設置C語言風格縮進
      :set nu                 以顯示行號

2.GCC編譯

(1)經常使用選項

-c      只編譯不連接,生成目標文件.o
-S      只編譯不彙編,生成彙編代碼
-E      只進行預編譯,不作其餘處理
-g      在可執行程序中包含標準調試信息

(2)編譯過程

原文件->預處理->編譯->彙編->鏈接->可執行文件
  • 預處理:gcc –E xxx.c –o xxx.i
    • gcc –E調用cpp 生成中間文件
  • 編 譯:gcc –S xxx.i –o xxx.s
    • gcc –S調用ccl翻譯成彙編文件
  • 匯 編:gcc –c xxx.s –o xxx.o
    • gcc -c調用as翻譯成可重定位目標文件
  • 鏈 接:gcc xxx.o –o xxx
    • gcc -o調用ld**建立可執行目標文件
  • 運行可執行文件 ./xxx
    在命令行上運行這個可執行目標文件須要輸入它的名字(-o後若不指定生成文件名,則默認爲a.out)

3.GDB調試

(1)基本命令

  • 進入GDB

    gcc -g xxx.c -o xxx
      gdb xxx
  • 查看源碼

    (gdb) l         進行行號提示
      (gdb) b n       在第n行設置斷點
      (gdb) r         運行代碼,運行至斷點處
    
      (gdb) n         單步運行
      (gdb) c         使程序繼續往下運行,直到再次遇到斷點或程序結束
      (gdb) q         退出GDB
      (gdb) watch n   在"n"設置了觀察點,觀察變量的變化狀況

(2)四種斷點

  • 函數斷點

    b   函數名 條件表達式
  • 行斷點

    b   行數或函數名  條件表達式
  • 條件斷點

    b   行數或函數名  if表達式
  • 臨時斷點

    tbreak  行數或函數名  條件表達式

4.makefile

  • 用途:實現自動化編譯

  • 格式:

    target(目標文件)... : prerequisites(要生成那個target所須要的文件或是目標)...
          command(任意的Shell命令,就是make須要執行的命令)
      ...
  • 這是一個文件的依賴關係,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。
  • Makefile中的宏,也稱做變量,有兩種定義方式

    遞歸展開方式      VAR=var
      簡單方式        VAR:=var
  • 使用變量的格式爲

    $(VAR)

(三)教材總結(不少以前的博客都已經寫過,只寫重要的點,不展開)

1.第一章:計算機系統漫遊

(1)信息=位+上下文

系統中全部信息的都是由一串位表示的,區分不一樣數據對象的惟一方法是它的上下文。

(2)馮式結構

CPU執行指令的操做:加載、存儲、操做、跳轉

(3)存儲系統核心思想———緩存

(4)操做系統核心抽象

文件、虛存、進程、虛擬機

(5)查看源文件用od 命令 : od -tc -tx1 hello.c

2.連接

(1)連接器的兩個任務

- 符號解析
- 重定位

(2)目標文件的三種形式

- 可重定位目標文件
- 可執行目標文件
- 共享目標文件

(3)目標文件格式

- a.out     可執行文件
- COFF      通常目標文件格式
- PE            可移植可執行文件格式
- ELF       可執行可鏈接文件格式

(4)readelf命令

用於顯示一個/多個elf格式目標文件的信息

(5)全局符號

- 強符號:函數和已經初始化的全局變量
- 弱符號:未初始化的全局變量
  • 規則:

    - 不容許有多個強符號
      - 如有一個強符號和多個弱符號,選強符號
      - 如有多個弱符號,任選一個

(6)處理目標文件的工具

- AR            建立靜態庫,插入、刪除、列出和提取成員
- STRINGS       列出一個目標文件中全部可打印的字符串
- STRIP         從目標文件中刪除符號表中定義的符號
- NM            列出一個目標文件中節的名字和大小
- READELF       顯示一個目標文件的完整結構
- OBJDUMP       二進制工具之母,能夠顯示一個目標文件中全部的信息

3.信息的表示和處理

(1)三種數字

無符號數、有符號數(2進制補碼)、浮點數
  • 補碼是利用寄存器的長度是固定的特性簡化數學運算,只要一個加法器就能夠實現全部的數學運算。
  • 進制轉換:拿二進制做中間結果

(2)信息存儲

  • gcc -m32 能夠在64位機上(好比實驗樓的環境)生成32位的代碼

  • 字節順序是網絡編程的基礎

    - 小端是「高對高、低對低」
      - 大端是「高對低、低對高」
  • 邏輯運算(結果是1或0)和位運算(結果是位向量)

    只要一個與非門,就能夠完成全部的邏輯運算。
  • 掩碼是位運算的重要應用,對特定位能夠置一,能夠清零

(3)整數表示與運算

  • C語言中有符號數和無符號數的轉換規則,位向量不變——信息就是位+上下文。

  • 0擴展和符號擴展

    零擴展:要將一個無符號數轉換爲一個更大的數據類型,只需簡單的最高位前加0。
      符號擴展:將一個補碼數字轉換爲一個更大的數據類型,在表示中添加最高有效位值的副本。
  • 截斷數字

    截斷一個數字可能會改變其值,這也是值溢出的一種形式。
  • 計算機執行的「整數運算」其實是一種模運算。
  • 表示數字的有限字長限制了可能的值的取值範圍。
  • 不管運算數是以無符號形式仍是補碼形式表示,都有徹底同樣或者很是相似的位級行爲。

(4)浮點數——IEEE浮點表示

  • IEEE浮點標準用V = (-1)^s × M × 2^E的形式來表示一個數

    - 符號:s決定這個數是負數(s=1)仍是正數(s=0),而對於數值0的符號位解釋做爲特殊狀況處理。
      - 尾數:M是一個二進制小數,它的範圍是1~2-ε,或者是0~1-。
      - 階碼:E的做用是對浮點數加權,這個權重是2的E次冪(多是負數)。
  • 將浮點數的位表示劃分爲三個字段,分別對這些值進行編碼:

    - 一個單獨的符號位s直接編碼符號s。
      - k位的階碼字段exp = ek-1…e1e0編碼階碼E。
      - n位小數字段frac = fn-1…f1 f0編碼尾數M,可是編碼出來的值也依賴於階碼字段的值是否等於0。

4.程序的機器級表示

(1)尋址方式三代

DOS時代的平坦模式,不區分用戶空間和內核空間,很不安全
8086的分段模式
IA32的帶保護模式的平坦模式

(2)ISA指令集體系結構

  • 機器級程序的格式和行爲,它定義了處理器狀態、指令的格式以及每條指令對狀態的影響。

    - 程序計數器(一般稱爲PC,用%eip表示),指示將要執行的下一條指令在存儲器中的地址。
      - 整數寄存器文件:存儲地(對應於C語言的指針)或整數數據。
      - 條件碼寄存器:保存着最近執行的算數或邏輯指令的狀態信息,用來實現控制或者數據流中的條件變化。
      - 浮點寄存器:用來存放浮點數據。

(3)編譯過程:

- C預處理器插入宏和頭文件:gcc -E xxx.c -o xxx.i
- 編譯器產生源代碼的彙編代碼:gcc -S xxx.i -o xxx.s
- 彙編器化成二進制目標代碼:gcc -c xxx.s -o xxx.o
- 連接器生成最終可執行文件:gcc xxx. -o xxx

- 用objdump -d xxx.o -o xxx.s 反彙編

(4)算術和邏輯操做

  • 加載有效地址

    leal,從存儲器讀數據到寄存器,而從存儲器引用的過程其實是將有效地址寫入到目的操做數。目的操做數必須是一個寄存器。
  • 一元操做和二元操做

    一元操做:只有一個操做數,既是源又是目的,能夠是一個寄存器或者存儲器。
      二元操做:第二個操做數既是源又是目的,兩個操做數不能同時是存儲器。

(5)棧幀

  • 棧幀結構

    - 爲單個過程分配的棧叫作棧幀,寄存器%ebp爲幀指針,而寄存器指針%esp爲棧指針,程序執行時棧指針移動,大多數信息的訪問都是相對於幀指針。
      - 棧向低地址方向增加,而棧指針%esp指向棧頂元素。
  • 轉移控制

    - call:目標是指明被調用過程起始的指令地址,效果是將返回地址入棧,並跳轉到被調用過程的起始處。
      - ret:從棧中彈出地址,並跳轉到這個位置。
      - 函數返回值存在%eax中

5.處理器體系結構

(1)Y86指令集體系結構

  • 程序員可見的狀態(Y86程序中的每條指令都會讀取或修改處理器狀態的某些部分)

    - 8個程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
      - 條件碼:ZF(零)、SF(符號)、OF(有符號溢出)
      - 程序計數器(PC):存放當前正在執行的指令的地址
      - 存儲器:很大的字節數組,保存着程序和數據。Y86系統用虛擬地址來引用存儲器的位置,硬件和操做系統軟件聯合起來將虛擬地址翻譯成實際或者物理地址。
      - 狀態碼(stat):代表程序執行的整體狀態。(異常處理)
  • 指令編碼規則

    高4位爲代碼部分,低四位爲功能部分
  • Y86異常(狀態碼:描述程序執行的整體狀態。)

    值       名字      含義
      1       AOK     正常操做
      2       HLT     處理器執行halt指令(指令中止)
      3       ADR     遇到非法地址
      4       INS     遇到非法指令

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

  • 實現一個數字系統須要的三個組成部分

    - 計算對位進行操做的函數的組合邏輯
      - 存儲位的存儲器元素
      - 控制存儲器元素更新的時鐘信號

6.存儲器層次結構

(1)三種常見存儲技術:RAM/ROM/磁盤

  • 隨機訪問存儲器(RAM)

    靜態RAM(SRAM)
      動態RAM(DRAM)
  • 非易失性存儲器(ROM)

    • 可編程ROM(PROM):只能被編程一次。PROM每一個存儲單元有一種熔絲,只能用高電流熔斷一次。
    • 可擦寫可編程ROM(EPROM):紫外線光照射過窗口,EPROM就被清除爲0,被擦除和重編程的次數爲1000次。
    • 電子可擦除ROM(EEPROM):不須要一個物理上獨立的編程設備,所以能夠直接在印製電路卡上編程,可以編程的次數爲10^5。
    • 閃存:基於EEPROM,爲大量的電子設備提供快速而持久的非易失性存儲。
  • 磁盤

    - 磁盤結構:盤片、磁道、扇區、間隙、柱面
      - 磁盤容量:記錄密度、磁道密度、面密度
      - 訪問時間:尋道時間+旋轉時間+傳送時間
      - 訪問磁盤:CPU使用一種稱爲存儲器映射I/O的技術向I/O設備發出命令,地址空間中爲I/O設備通訊保留的地址稱爲I/O端口。
  • 邏輯磁盤塊
  • 數據總線、控制總線、地址總線
  • 系統總線、存儲總線、I/O總線
  • 讀寫事務:讀事務,從主存傳數據到CPU;寫事務,從CPU傳數據到主存。

(2)局部性

局部性原理:一個編寫良好的計算機程序傾向於引用鄰近於其餘最近引用過的數據項,或者最近引用過的數據項自己。有良好局部性的程序比局部性差的程序運行的更快,在硬件層引入高速緩存存儲器就體現了局部性原理。
  • 對程序數據引用的局部性

    - 時間局部性(temporal locality):被引用過一次的存儲器位置在將來會被屢次引用(一般在循環中)。
      - 空間局部性(spatial locality):若是一個存儲器的位置被引用,那麼未來他附近的位置也會被引用。
  • 取指令的局部性

    - 程序指令是存放在存儲器中的,CPU讀取這些指令的過程當中評價一個程序關於取指令的局部性。
      - 代碼區別與程序數據的一個重要屬性就是在運行時指令是不能被修改的。
  • 重複引用同一個變量的程序有良好的時間局部性
  • 對於具備步長爲k的引用模式的程序,步長越小,空間局部性越好。
  • 對於取指令來講,循環具備良好的時間和空間局部性。循環體越小,迭代次數越多局部性越好。

(3)存儲器層次結構

  • 中心思想:每層存儲設備都是下一層的「緩存」

    - 緩存命中:當程序須要第k+1層的某個數據對象d時,首先在當前存儲的第k層的一個塊中查找d,若是d恰好在第k層中,則稱爲緩存命中。
      - 緩存不命中:若是k層中沒有緩存數據d,則稱爲緩存不命中,此時要從k+1層取出包含d的塊,可能會覆蓋(替換/驅逐)如今的一個塊(犧牲塊)。
      - 決定該替換哪一個快是緩存的替換策略來控制的。
  • 緩存不命中的種類

    - 強制性不命中/冷不命中:第k層緩存是空的(冷緩存),只是短暫的狀態,不會在反覆訪問存儲器使得緩存暖身以後的穩定狀態出現。
      - 衝突不命中:第k+1層的第i塊,必須放置在第k層的塊(i mod 4)中,這種限制性的放置策略引發衝突不命中。
  • 不命中率:不命中數量/引用數量
  • 命中率:1-不命中率

  • 高速緩存存儲器結構

    • 高速緩存的結構用元組(S,E,B,m)來描述,高速緩存的大小C = S * E * B

      - s個組索引位:一個無符號整數,說明字必須存儲在哪一個組中。
        - t個標記位:組中的哪一行包含這個字。
        - b個塊偏移位:在B個字節的數據塊中的字偏移。

2、實踐操做

(一)動態庫與靜態庫

.c              源碼
    .a(.lib)        靜態庫
    .so(.dll)       動態庫

(1)靜態庫

gcc -c add.c sub.c              編譯所用.c文件爲.o
ar rcsv libmath.a add.o sub.o   建立math靜態庫
gcc -o main main.c -L. -lmath   建立可執行文件
./main                          運行
  • 參數

    gcc -c      只編譯,不鏈接成爲可執行文件.
      ar  -r      在庫中插入模塊(替換)
          -c      建立一個庫
          -s      寫入一個目錄文件索引到庫中
      .L -lmath           在當前目錄下查找math庫文件

(2)動態庫(共享庫)

gcc -fPIC -Wall -c add.c sub.c          編譯
gcc -shared -o libmath.so add.o sub.o   建立math共享庫
gcc -o main main.c -L. -lmath           建立可執行文件
./main                                  運行
  • 參數

    -fPIC   指示編譯器生成與位置無關的代碼
      -shared 指示連接器建立一個共享的目標文件

(二)正則表達式

正則表達式( regular expression,簡寫爲 regexes),是用來操做和檢驗字符串數據的一種強大工具,是採用某種模式去匹配一類字符串的一個公式。
  • 規則

    • ‘多種字符’ 表達式:正則表達式中的一些表示方法,能夠匹配 '多種字符 ' 其中的任意一個字表達符式。

      \d      0~9 中的任意一個數字
        \w      任一字母或數字或下劃線,即A~Z、a~z、0~九、_中任一個
        \s      包括空格、製表符、換頁符等空白字符中任意一個
        .       匹配除換行符( \n)之外任意一個字符
        [ ]     匹配其中任意字符,但每次匹配只匹配一個
        [^ ]    匹配除其中的任意字符,每次匹配只匹配一個
    • 簡單的轉義字符

      \       表示後面的字符自己
    • 修飾匹配次數

      {n}     表達式重複n次,如"a{5}" 至關於"aaaaa"
        {m,n}   表達式至少重複m次,最多重複n次,如:"ba{1,3}"能夠匹配"ba"或"baa"或"baaa"
        {m,}    表達式至少重複m次,好比:"\w\d{2,}"能夠匹配 "a12","_456"等
        ?   表達式出現 0次或者 1次,至關於 {0,1}
        +   表達式至少出現 1次,至關於 {1,}
        *   表達式不出現或出現任意次,至關於{0, }
  • 匹配方法

    ^       從字符串開始的地方匹配
      $       從字符串結束的地方匹配
      |       能夠匹配左或者右
    
      貪婪模式        儘量多的匹配
      非貪婪模式   儘量少的匹配

3、本身的收穫與不足

1.硬知識、軟知識和元知識

  • 本學期課程一開始,老師就提出關於這個這三種知識的觀點,我深受啓發:

    - 硬知識:學習的知識點,技能,我以爲這是那種能夠百度出來的,每次考試都背了不少,一考完就忘的知識。
      - 軟知識:經過長期實踐中總結和體會出來的東西,我以爲它應該是長期經驗造成的一種思惟方式。
      - 元知識:知識的知識。我理解它就是一些最基本的、具備高複用性的知識,是對知識的認識方式。
  • 進入大學之後,我常常思考到底如何學習,不斷地反思本身。聯想一下本身一直以來的學習過程,可能以前過於看重對硬知識的記憶,到大學以後,變得愈來愈力不從心。
  • 我記得上學期學java的時候老師在課堂上曾經說過,不少人學了好久的東西,可是最終仍是停留在很熟練的初學者的階段,甚至還不能算是合格,這句話對我觸動很大,我以爲本身以前學的不少東西都是這樣,就像office辦公軟件,若是不是我考MOS、去參加比賽,我可能歷來沒有想過office裏咱們最經常使用的word就有這麼多歷來沒有使用過的功能。
  • 嘗試不斷改變本身的學習方式,其實就是在不斷培養本身造成軟知識和元知識的能力。我以爲老師進行課堂改革的本意可能也是如此,各類實踐項目和加分項只是督促咱們創建這種學習方式的形式而已。
  • 這三種知識的分類,在個人理解應該是對於在學習中如何構建知識框架的指導,是怎樣經過已有的知識來把握新知識脈絡的方法。這樣的思路對我從此的學習,尤爲是自學,有很大的幫助。

2.搜索能力

  • 「搜商」是一種很重要的能力,在這學期的學習中,這種能力的重要性尤其突出。就拿學習這個markdown來說,功能瞭解和操做方法都是百度來的。
  • 在學習Linux命令的時候,老師就強調man、cheat、find......這一系列幫助文檔、查找工具的重要性。就像百度同樣,在Linux中,有問題就能夠去找man,查找東西能夠locate,某個命令的man看不懂還能夠cheat,儘可能經過本身的搜索一步步的解決問題,而不是不動腦子的照搬。
  • 若是徹底讓咱們本身去搜索須要的東西,搞清某個實驗的學習目標和實現其主要功能的方法步驟並不容易(好比這學期學習的信息安全概論實驗,感受方向性很不明確,本身提早作實驗的時候無從下手,花了不少的時間結果檢查的時候老師問的一些問題甚至尚未想到過),感受婁老師寫這麼多的學習任務、教材導讀、每章重點和實驗樓指導真的是很是辛苦。

3.關於讀書

  • 剛開始看到厚的教材,我以爲這一個學期確定很差過,估計天天就光看着這個書時間都不夠。可是這幾周下來,對於如何閱讀每一章節我也有了本身的方法:先看教材導讀,再去通篇閱讀,從重點習題出發理解相應內容。
  • 可是若是要把每個點吃透須要更多的時間,不是考點的地方我就囫圇吞棗樣的一帶而過,致使有些問題仍是沒有搞清楚。
  • 上學期的彙編我學的不好,結果沒想到這本書有不少地方都與以前的彙編有緊密聯繫,讓我學得又吃力又後悔,這就是欠債。相反,個人EDA學得還不錯,在HCL的部分感受就輕鬆了不少。

4、課程建議和意見

  1. 這個課程剛開始的時候,我以爲任務量仍是有些大。雖然我知道Linux老師在上學期java課程中就說過,可是我沒有及時的學習,又是有欠債,這確實是個人問題。可是在大多同窗都確實都沒有接觸過的時候,一週作的那12個實驗裏幾乎全都是新知識,當時的重點也沒有明確,天天拿出好幾個小時去閱讀和操做,還卡在一些如今看來都不是問題的問題上,花在寫博客上的時間也不少。我以爲如今這種每次有導讀和重點的形式就很好。
  2. 加分種類繁多,有些搞不清到底這些加分那些是我必須去作的,只能是能搶到就作。還有那個深化實踐類項目是每一個人都必須作的嗎?剛開始的時候給的是十一那節課沒來的人,後來就變成羣裏搶的了,不太清楚這個究竟是屬於哪部分的。

參考資料


參考資料1:20135317信息安全系統設計基礎第一週學習總結
參考資料2:20135317信息安全系統設計基礎第二週學習總結
參考資料3:20135317信息安全系統設計基礎第三週學習總結
參考資料4:20135317信息安全系統設計基礎第四周學習總結
參考資料5:20135317信息安全系統設計基礎第五週學習總結
參考資料6:20135317信息安全系統設計基礎第六週學習總結
參考資料7:歷次考試答案解析
參考資料8:正則表達式PDF

相關文章
相關標籤/搜索