20145329 《資訊安全系統設計基礎》第八周期中總結
知識點總結
一、Linux指令
1.man -k
- man是manul的縮寫,我們可以通過man man來檢視man的幫助
-
man有一個-k 選項用起來非常好,這個選項讓你學習指令,程式設計時有了一個搜尋引擎,可以舉一反三。 我們通過一個例子來說明,比如資料結構中學過排序(sort),我不知道C語言中有沒有完成這個功能的函數,可以通過“man -k sort”來搜尋
結合後面學習的grep 指令和管道,可以多關鍵字查找:
man -k key1 | grep key2 | grep key3 | ...
-
Linux 中,手冊通常被分為8個區段,安排如下:
1 一般指令
2 系統調用
3 庫函數,涵蓋了C标準函數庫
4 特殊檔案(通常是/dev中的裝置)和驅動程式
5 檔案格式和約定
6 遊戲和屏保
7 雜項
8 系統管理指令和守護程序
要檢視相應區段的内容,就在 man 後面加上相應區段的數字即可
2.cheat
- cheat 指令不是Linux自帶的,是在GNU通用公共許可證下,為Linux指令行使用者發行的互動式備忘單應用程式。它提供顯示Linux指令使用案例,包括該指令所有的選項和簡短但尚可了解的功能。
3.grep -nr xxx /usr/include
- grep 可以對檔案全文檢索,支援正規表達式
-
如果想查找某個宏,我們已知宏儲存在include檔案夾中,可以使用下列語句:
grep -nr XXX /usr/include(XXX為所要找的宏)
4.其他指令
-
ls指令
l s或ls .顯示是目前目錄的内容,這裡“.”就是參數,表示目前目錄,是預設的可以省略。我們可以用ls -a .顯示目前目錄中的所有内容,包括隐藏檔案和目錄。其中“-a” 就是選項,改變了顯示的内容
檢視某一個目錄的完整屬性,而不是顯示目錄裡面的檔案屬性:
$ ls -dl
顯示所有檔案大小,并以普通人類能看懂的方式呈現:
$ ls -AsSh
使用較長格式列出檔案:
$ ls -l
-
find
查找一個檔案在系統中的什麼位置,locate是神速版本的find(Windows下有個Everything工具和locate類似).
- whereis,which告訴你使用的指令工具裝在什麼地方。
-
touch 指令建立檔案
$ touch adsfasd.txt wergjlkas.txt
-
輸出圖形字元的指令banner
$ banner shiyanlou
-
檢視使用者
$ who am i 或者 $ who mom likes
-
su和sudo
可以切換到使用者user
sudo 可以以特權級别運作cmd指令
su - 指令也是切換使用者
-
建立使用者:
$ sudo adduser lilei
-
新使用者建立 home 目錄:
$ ls /home
-
切換登入使用者:
$ su -l lilei
-
groups指令
$ groups shiyanlou
其中$之前表示使用者,後面表示該使用者所屬的使用者組。
-
檢視/etc/group檔案
$ cat /etc/group | sort
這裡 cat 指令用于讀取指定檔案的内容并列印到終端輸出
-
其它使用者加入 sudo 使用者組
預設情況下新建立的使用者是不具有 root 權限的,也不在 sudo 使用者組,可以讓其加入sudo使用者組進而擷取 root 權限。
$ su -l lilei $ sudo l
-
删除使用者
$ sudo deluser lilei --remove-home
-
修改檔案權限
$ chmod go-rw iphone
-
路徑
進入上一級目錄:
$ cd ..
進入你的“home”目錄:
$ cd ~ # 或者 cd /home/
使用 pwd 擷取目前路徑:
$ pwd
以絕對路徑和相對路徑的方式進入 /usr/local/bin 目錄:
絕對路徑
$ cd /usr/local/bin
相對路徑
$ cd ../../usr/local/bin
-
切換回使用者的 /home/shiyanlou 目錄:
$ cd ~
-
建立名為"mydir"的空目錄:
$ mkdir mydir
-
複制檔案
将之前建立的"test"檔案複制到"/home/shiyanlou/father/son/grandson"目錄中:
$ cp test father/son/grandson
要成功複制目錄需要加上-r或者-R參數,表示遞歸複制:
$ cp -r father family
-
删除
$ rm test
-f參數強制删除:
$ rm -f test
删除目錄
$ rm -r family
-
移動檔案
将檔案"file1"移動到"Documents"目錄mv 源目錄檔案 目的目錄:
$ mkdir Documents $ mv file1 Documents
-
重命名檔案
$ mv file1 myfile
-
檢視檔案
使用cat,tac和nl指令檢視檔案檢視之前從"/etc"目錄下拷貝來的passwd檔案:
$ cat passwd
可以加上-n參數顯示行号:
$ cat -n passwd
-
使用declare指令建立一個變量名為 tmp 的變量:
$ declare tmp
使用=号指派運算符為變量 tmp 指派為 shiyanlou:
$ tmp=shiyanlou
讀取變量的值:
$ echo $tmp
二、程式編譯指令
1 vim
- 大寫“K”可以用來查找函數的幫助資訊:檢視 man page,指令模式下,将光标放在函數名上,按"K"可以直接察看 man page。
-
幾個設定
set nu 顯示行号
set ai 自動縮行
set ts=4 設定一個 TAB 鍵等于幾個空格
-
移動光标
[[ 轉到上一個位于第一列的"{"
]] 轉到下一個位于第一列的"{"
{ 轉到上一個空行
} 轉到下一個空行
gd 轉到目前光标所指的局部變量的定義
2. gcc
- 預處理:gcc –E hello.c –o hello.i;gcc –E調用cpp
- 編 譯:gcc –S hello.i –o hello.s;gcc –S調用ccl
- 彙 編:gcc –c hello.s –o hello.o;gcc -c 調用as
- 鍊 接:gcc hello.o –o hello ;gcc -o 調用ld
3.gdb
- gdb programm(啟動GDB)
- b 設斷點(要會設4種斷點:行斷點、函數斷點、條件斷點、臨時斷點)
- run 開始運作程式
- bt 列印函數調用堆棧
- p 檢視變量值
- c 從目前斷點繼續運作到下一個斷點
- n 單步運作
- s 單步運作
-
quit 退出GDB
應該掌握的調試指令有:
- display 跟蹤變量值的改變
- until 跳出循環
- finish 跳出函數
- help 幫助
-
四種斷點:
行斷點 b [行數或函數名]
函數斷點 b [函數名]
條件斷點 b [行數或函數名]
臨時斷點 tbreak [行數或函數名]
4. make(makefile的一般寫法)
-
一個makefile檔案主要含有一系列的規則,每條規則包含以下内容:
需要由make工具建立的目标體,通常是可執行檔案和目标檔案,也可以是要執行的動作,如‘clean’;
要建立的目标體所依賴的檔案,通常是編譯目标檔案所需要的其他檔案。
建立每個目标體時需要運作的指令,這一行必須以制表符TAB開頭
-
格式為:
test(目标檔案): prog.o code.o(依賴檔案清單)
tab(至少一個tab的位置)
gcc prog.o code.o -o test(指令)
-
定義變量的兩種方式:
遞歸展開方式 VAR=var
簡單方式 VAR:=var
-
用途:
實作自動化編譯
三、教材内容
第1章 計算機系統漫遊
-
作業系統核心是應用程式和硬體之間的媒介。它提供三個基本的抽象:
(1)檔案是對I/O的抽象
(2)虛拟存儲器是對主存和磁盤的抽象
(3)程序是對處理器、主存抽象和I/O裝置的裝置最後,網絡提供了計算機系統之間通信的手段
第2章 資訊的表示和處理
- 無符号數編碼基于傳統的二進制表示法,表示大于或等于零數字
- 補碼編碼是表示有符号号整數的最常見的方式,有符号整數就是可以為正或為負的數字
- 浮點數編碼是表示實數的科學技術法的以二為基數的版本
-
資訊存儲
虛拟存儲器是一個非常大的位元組數組
虛拟位址是以一個字來編碼的,字長決定的最重要的系統參數就是虛拟位址空間的最大大小
可移植性是使程式對不同資料類型的确切大小不敏感,對于32位機器來說,同樣的掩碼可以寫成0×FFFFFFFF,但是這樣的的代碼是不可移植的
對于跨越多位元組的程式對象,我們必須建立的兩個規則:對象位址以及存儲器中如何排列這些位元組
多位元組對象被存儲為連續的位元組序列,對象的位址為所使用位元組中最小的位址
-
整數表示
補碼:最常見的有符号數的計算機表示
表達式×将×值轉換成無符号數值,而u将u的值轉換為有符号整數
T2U函數将一個有符号數映射為它相應的無符号數十,負數就被轉換成大的正數
c語言有符号數和位富豪數轉換的原則是最底層的位表示保持不變,在采用補碼的機器上,無符号數轉換為有符号數,效果就是應用U2Tw,從有符号數轉換為無符号數,就是應用函數T2Uw,w表示資料類型的位數。
截斷:在32位機器上,将強制int型的x轉換為short時,是将32位的int截斷為16位的short int。
截斷一個數字可能會改變它的值——溢出的一種形式
-
整數運算
無符号數運算可以被視為一種模運算形式
一個算數運算溢出,是指将完整的整數結果不能放到資料類型的字長限制中去。
-
浮點數
IEEE浮點數标準用V=(-1)^s M2^E的形式來表示一個數:
符号:s決定這個數十整數(s=1)還是負數(s=0),而對于數值0的符号位解釋作為特殊情況處理
尾數:M是一個二進制小數
階數:E的作用是對浮點數權重,這個權重是2的E次幂(可能是負數)
IEEE标準中指定浮點運算行為方法的一個優勢在于可以獨立于任何具體的硬體或軟體
第3章 程式的機器級表示
-
條件碼的三種使用方法:
1)根據條件碼的某個組合,将一個位元組置0或1
2)條件跳轉到程式的某個其他部分
3)有條件的傳送資料
-
有條件跳轉
條件跳轉隻能是直接跳轉
跳轉指令名字和跳轉條件與SET指令時相比對的
跳轉指令編碼方式:
(1)PC相關的跳轉目标編碼:目标指令位址與緊跟在跳轉指令後面那條指令的位址之間的差作為編碼,此種方式編碼,尋址時程式計數器的值是跳轉指令後面的那條指令的位址,而不是跳轉指令本身的位址(隻需兩個位元組)
(2)“絕對位址”編碼:用四個位元組直接指定目标
-
最頂端的棧幀以兩個指針界定:
寄存器%ebp為幀指針
寄存器%esp為棧指針
-
棧向低位址方向增長,棧指針%esp指向棧頂元素:
棧指針值适當減小可以配置設定沒有指定初始值的資料的空間
類似的,可以通過增加棧指針來釋放空間
第4章 處理器體系結構
-
Y86異常
(1)AOK:正常操作
(2)HTL:處理器執行halt指令
(3)ADR:遇到非法位址
(4)INS:遇到非法指令
-
數字系統三個主要組成部分:
(1)計算對位進行操作的函數的組合邏輯
(2)存儲位的存儲器元素
(3)控制存儲器元素更新的時鐘序号
-
組合電路:很多邏輯門組合成的一個網建構的計算塊。建構這些網的兩條限制:
(1)兩個或多個邏輯網的輸出不能連接配接在一起
(2)這個網必須是無環的
bool eq=(a&&b) || (!a&&!b)
- 時序電路:引入按位存儲資訊裝置,使電路有狀态并且在這個狀态上進行計算的系統。時鐘寄存器存儲單個字或位,随機通路寄存器(處理器的虛拟存儲器系統、寄存器檔案)存儲多個字。
- Y86指令計算六個基本階段:取值、譯碼、執行、訪存、寫回、更新PC。
第6章 存儲器層次結構
-
存儲技術:
SRAM存儲器 、DRAM存儲器、ROM存儲器、旋轉硬碟、固态硬碟
-
對扇區的通路時間有三個主要的部分:
尋道時間、旋轉時間、傳送時間
-
兩種不同形式
空間局部性
時間局部性
一般來說,随着步長增加,空間局部性下降。
- 高速緩存與緩存:高速緩存cash是一個小而快速的儲存設備,它作為存儲在更大、更慢的裝置中的資料對象的緩沖區域。使用高速緩存的過程稱為緩存。
- 存儲器層次結構的中心思想:對于每個k,位于k層的更快更小的儲存設備作為位于k+1層的更大更慢的儲存設備的緩存,即每層儲存設備都是下一層的“緩存”
-
緩存命中
當程式需要第k+1層的某個資料對象d時,首先在目前存儲在第k層的一個塊中查找d,如果d剛好緩存在第k層中,就稱為緩存命中。
-
緩存不命中
即第k層中沒有緩存資料對象d。
-
替換政策:
決定替換哪個塊
随機替換政策:随機選擇一個犧牲塊
最近最少被使用替換政策:選擇最後被通路的時間距現在最遠的塊
-
高速緩存存儲器
L1高速緩存、L2高速緩存、L3高速緩存
-
高速緩存确定一個請求是否命中,然後取出被請求的字的過程,分為三步:
組選擇
行比對
字抽取
-
直接映射高速緩存中的沖突不命中
原因:在塊之間抖動,即這些塊被映射到了同一個高速緩存組,高速緩存反複的加載和驅逐相同的高速緩存塊的組
解決方法:在每個數組的結尾放B位元組的填充(B位元組是一個塊的長度,一行是一個塊,相當于分開了行)進而使得他們映射到不同的組。
-
緩存不命中的種類
強制性不命中/冷不命中:第k層緩存是空的(冷緩存),隻是短暫的狀态,不會在反複通路存儲器使得緩存暖身之後的穩定狀态出現。
沖突不命中:第k+1層的第i塊,必須放置在第k層的塊(i mod 4)中,這種限制性的放置政策引起沖突不命中。
- 高速緩存的結構用元組(S,E,B,m)來描述,高速緩存的大小C = S * E * B。
第七章 連結
-
連結器的兩個任務
符号解析
重定位
-
目标檔案的三種形式
可重定位目标檔案
可執行目标檔案
共享目标檔案
-
目标檔案格式
a.out 可執行檔案
COFF 一般目标檔案格式
PE 可移植可執行檔案格式
ELF 可執行可連接配接檔案格式
-
全局符号
強符号:函數和已經初始化的全局變量
弱符号:未初始化的全局變量
-
規則:
不允許有多個強符号
若有一個強符号和多個弱符号,選強符号
若有多個弱符号,任選一個
自己的收獲
在一定基礎上,掌握了虛拟機的使用,linux系統的操作,對vim編輯器也有一定的了解,對其中一些指令操作也有了一定的實踐積累。
自己的不足
書本上的知識沒有做到全部搞懂,看書可能還可以回憶起來,但是抛開書本,把它實際應用到一個執行個體中的時候還是無從下手,得到别人的指點才會有點恍然大悟的感覺。在看書的過程中要麼就是沒有全部看懂,沒能領略作者的意圖,要麼就是一知半解的一帶而過,最後消化吸收的甚少,基礎沒打好,最後就想要仔細串一遍知識腦子裡都是雜亂的,還有些知識甚至自己都不知道自己不知道。
課程建議和意見
用這種“做中學”的方式已經學習了差不多一年了,這是一種很大限度的開發學生的潛能和刺激學生的學習意識的教學方式,強烈的突出了高中生和大學生學習模式的轉變,讓我們以一種“成人”的方式學習。但是好多時候這種學習方式讓我覺得自己做了很多但是最後不知道自己到底做了什麼,也不知道學會了什麼,希望老師能在适當的時候幫我們“整理”一下思路,幫助學生更好的吸收了解課程,最終轉化成軟知識。
轉載于:https://www.cnblogs.com/jdy1453/p/6035186.html