學習目標:(連接是我每週博客中的相應部分和老師發佈的考試答案)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
man -k k1 | grep k2 | grep k3 ...
man 中的不一樣區段表明相應的內容,經過限定查找內容的區段,能夠過濾出更簡潔的結果,共有8個區段:linux
1 Linux中的通常命令 2 系統調用 3 庫函數,涵蓋了C語言的標準函數庫 4 特殊文件(一般是/dev中的設備)和驅動程序 5 文件格式和約定 6 遊戲和屏保 7 雜項 8 系統管理命令和守護進程
查看某命令在指定區段內的解釋時用法:程序員
man 區段號 命令
- find 通常查找 - locate 急速查找 - whereis 查找文件所在文件夾 - which 查找可執行文件所在文件夾
普通模式 插入模式 可視模式 選擇模式 命令行模式 Ex模式
插入正則表達式
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 以顯示行號
-c 只編譯不連接,生成目標文件.o -S 只編譯不彙編,生成彙編代碼 -E 只進行預編譯,不作其餘處理 -g 在可執行程序中包含標準調試信息
原文件->預處理->編譯->彙編->鏈接->可執行文件
gcc –E
調用cpp 生成中間文件gcc –S
調用ccl翻譯成彙編文件gcc -c
調用as翻譯成可重定位目標文件gcc -o
調用ld**建立可執行目標文件進入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"設置了觀察點,觀察變量的變化狀況
函數斷點
b 函數名 條件表達式
行斷點
b 行數或函數名 條件表達式
條件斷點
b 行數或函數名 if表達式
臨時斷點
tbreak 行數或函數名 條件表達式
用途:實現自動化編譯
格式:
target(目標文件)... : prerequisites(要生成那個target所須要的文件或是目標)... command(任意的Shell命令,就是make須要執行的命令) ...
Makefile中的宏,也稱做變量,有兩種定義方式
遞歸展開方式 VAR=var 簡單方式 VAR:=var
使用變量的格式爲
$(VAR)
系統中全部信息的都是由一串位表示的,區分不一樣數據對象的惟一方法是它的上下文。
CPU執行指令的操做:加載、存儲、操做、跳轉
文件、虛存、進程、虛擬機
- 符號解析 - 重定位
- 可重定位目標文件 - 可執行目標文件 - 共享目標文件
- a.out 可執行文件 - COFF 通常目標文件格式 - PE 可移植可執行文件格式 - ELF 可執行可鏈接文件格式
用於顯示一個/多個elf格式目標文件的信息
- 強符號:函數和已經初始化的全局變量 - 弱符號:未初始化的全局變量
規則:
- 不容許有多個強符號 - 如有一個強符號和多個弱符號,選強符號 - 如有多個弱符號,任選一個
- AR 建立靜態庫,插入、刪除、列出和提取成員 - STRINGS 列出一個目標文件中全部可打印的字符串 - STRIP 從目標文件中刪除符號表中定義的符號 - NM 列出一個目標文件中節的名字和大小 - READELF 顯示一個目標文件的完整結構 - OBJDUMP 二進制工具之母,能夠顯示一個目標文件中全部的信息
無符號數、有符號數(2進制補碼)、浮點數
gcc -m32 能夠在64位機上(好比實驗樓的環境)生成32位的代碼
字節順序是網絡編程的基礎
- 小端是「高對高、低對低」 - 大端是「高對低、低對高」
邏輯運算(結果是1或0)和位運算(結果是位向量)
只要一個與非門,就能夠完成全部的邏輯運算。
掩碼是位運算的重要應用,對特定位能夠置一,能夠清零
C語言中有符號數和無符號數的轉換規則,位向量不變——信息就是位+上下文。
0擴展和符號擴展
零擴展:要將一個無符號數轉換爲一個更大的數據類型,只需簡單的最高位前加0。 符號擴展:將一個補碼數字轉換爲一個更大的數據類型,在表示中添加最高有效位值的副本。
截斷數字
截斷一個數字可能會改變其值,這也是值溢出的一種形式。
不管運算數是以無符號形式仍是補碼形式表示,都有徹底同樣或者很是相似的位級行爲。
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。
DOS時代的平坦模式,不區分用戶空間和內核空間,很不安全 8086的分段模式 IA32的帶保護模式的平坦模式
機器級程序的格式和行爲,它定義了處理器狀態、指令的格式以及每條指令對狀態的影響。
- 程序計數器(一般稱爲PC,用%eip表示),指示將要執行的下一條指令在存儲器中的地址。 - 整數寄存器文件:存儲地(對應於C語言的指針)或整數數據。 - 條件碼寄存器:保存着最近執行的算數或邏輯指令的狀態信息,用來實現控制或者數據流中的條件變化。 - 浮點寄存器:用來存放浮點數據。
- 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 反彙編
加載有效地址
leal,從存儲器讀數據到寄存器,而從存儲器引用的過程其實是將有效地址寫入到目的操做數。目的操做數必須是一個寄存器。
一元操做和二元操做
一元操做:只有一個操做數,既是源又是目的,能夠是一個寄存器或者存儲器。 二元操做:第二個操做數既是源又是目的,兩個操做數不能同時是存儲器。
棧幀結構
- 爲單個過程分配的棧叫作棧幀,寄存器%ebp爲幀指針,而寄存器指針%esp爲棧指針,程序執行時棧指針移動,大多數信息的訪問都是相對於幀指針。 - 棧向低地址方向增加,而棧指針%esp指向棧頂元素。
轉移控制
- call:目標是指明被調用過程起始的指令地址,效果是將返回地址入棧,並跳轉到被調用過程的起始處。 - ret:從棧中彈出地址,並跳轉到這個位置。 - 函數返回值存在%eax中
程序員可見的狀態(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 遇到非法指令
實現一個數字系統須要的三個組成部分
- 計算對位進行操做的函數的組合邏輯 - 存儲位的存儲器元素 - 控制存儲器元素更新的時鐘信號
隨機訪問存儲器(RAM)
靜態RAM(SRAM) 動態RAM(DRAM)
非易失性存儲器(ROM)
磁盤
- 磁盤結構:盤片、磁道、扇區、間隙、柱面 - 磁盤容量:記錄密度、磁道密度、面密度 - 訪問時間:尋道時間+旋轉時間+傳送時間 - 訪問磁盤:CPU使用一種稱爲存儲器映射I/O的技術向I/O設備發出命令,地址空間中爲I/O設備通訊保留的地址稱爲I/O端口。
讀寫事務:讀事務,從主存傳數據到CPU;寫事務,從CPU傳數據到主存。
局部性原理:一個編寫良好的計算機程序傾向於引用鄰近於其餘最近引用過的數據項,或者最近引用過的數據項自己。有良好局部性的程序比局部性差的程序運行的更快,在硬件層引入高速緩存存儲器就體現了局部性原理。
對程序數據引用的局部性
- 時間局部性(temporal locality):被引用過一次的存儲器位置在將來會被屢次引用(一般在循環中)。 - 空間局部性(spatial locality):若是一個存儲器的位置被引用,那麼未來他附近的位置也會被引用。
取指令的局部性
- 程序指令是存放在存儲器中的,CPU讀取這些指令的過程當中評價一個程序關於取指令的局部性。 - 代碼區別與程序數據的一個重要屬性就是在運行時指令是不能被修改的。
對於取指令來講,循環具備良好的時間和空間局部性。循環體越小,迭代次數越多局部性越好。
中心思想:每層存儲設備都是下一層的「緩存」
- 緩存命中:當程序須要第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個字節的數據塊中的字偏移。
.c 源碼 .a(.lib) 靜態庫 .so(.dll) 動態庫
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庫文件
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, }
匹配方法
^ 從字符串開始的地方匹配 $ 從字符串結束的地方匹配 | 能夠匹配左或者右 貪婪模式 儘量多的匹配 非貪婪模式 儘量少的匹配
本學期課程一開始,老師就提出關於這個這三種知識的觀點,我深受啓發:
- 硬知識:學習的知識點,技能,我以爲這是那種能夠百度出來的,每次考試都背了不少,一考完就忘的知識。 - 軟知識:經過長期實踐中總結和體會出來的東西,我以爲它應該是長期經驗造成的一種思惟方式。 - 元知識:知識的知識。我理解它就是一些最基本的、具備高複用性的知識,是對知識的認識方式。
這三種知識的分類,在個人理解應該是對於在學習中如何構建知識框架的指導,是怎樣經過已有的知識來把握新知識脈絡的方法。這樣的思路對我從此的學習,尤爲是自學,有很大的幫助。
參考資料1:20135317信息安全系統設計基礎第一週學習總結
參考資料2:20135317信息安全系統設計基礎第二週學習總結
參考資料3:20135317信息安全系統設計基礎第三週學習總結
參考資料4:20135317信息安全系統設計基礎第四周學習總結
參考資料5:20135317信息安全系統設計基礎第五週學習總結
參考資料6:20135317信息安全系統設計基礎第六週學習總結
參考資料7:歷次考試答案解析
參考資料8:正則表達式PDF