20145231 《信息安全系统设计基础》期中总结
20145231 《信息安全系統設計基礎》期中總結
教材學習內容復習
結合課本知識及再次實踐加深理解記憶
按照學習時相關重點知識的順序進行整理歸納
實踐內容:重要命令的使用 gdb調試棧幀(再理解) makefile 編譯運行代碼深入理解局部性
Linux中的重要常用命令
Linux中命令格式為:command [options] [arguments] []表示是可選的,即組成結構為:命令 [選項] [參數]
**man命令**man命令是Linux下的幫助指令,通過man指令可以查看Linux中的指令幫助、配置文件幫助和編程幫助等信息。常用選項:-a:在所有的man幫助手冊中搜索-k:根據關鍵字搜索聯機幫助,是一種模糊搜索-f:關鍵字精確搜索,等價于whatis指令,顯示給定關鍵字的簡短描述信息-P:指定內容時使用分頁程序-M:指定man手冊搜索的路徑參數:數字:指定從哪本man手冊中搜索幫助關鍵字:指定要搜索幫助的關鍵字man -k:常用來搜索,結合管道使用。例句如下:man -k k1 | grep k2 | grep 2 **cheat命令**在linux上,man命令幾乎是萬能的,但它卻不是最高效的。由于它給出的幫助信息很長,在短時間內不好理解,所以在這種情況下,用cheat命令更方便,cheat命令簡單來說,就是告訴你一個命令如何使用。它沒有提供其他額外多余的信息,只通過使用實例告訴你一個命令如何使用。 **grep命令**grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。命令格式:grep [options][options]主要參數:-c:只輸出匹配行的計數-I:不區分大小寫(只適用于單字符)-h:查詢多文件時不顯示文件名-l:查詢多文件時只輸出包含匹配字符的文件名-n:顯示匹配行及行號-s:不顯示不存在或無匹配文本的錯誤信息-v:顯示不包含匹配文本的所有行如果想查找某個宏,我們已知宏保存在include文件夾中,所以可以使用下列語句:grep -nr XXX /usr/include(XXX為所要找的宏) **find命令**find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。命令格式:find pathname -options [-print -exec -ok ...]參數:pathname:find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄print:find命令將匹配的文件輸出到標準輸出exec:find命令對匹配的文件執行該參數所給出的shell命令,相應命令的形式為'command' { } \;,注意{ }和\;之間的空格ok:和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行常用選項:-name:按照文件名查找文件-perm:按照文件權限來查找文件mtime -n +n:按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前-newer file1 ! file2:查找更改時間比文件file1新但比文件file2舊的文件-type:查找某一類型的文件,諸如:b - 塊設備文件,d - 目錄,c - 字符設備文件,p - 管道文件,l - 符號鏈接文件,f - 普通文件-size n:[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節計-depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。舉例:查找當前目錄下大小大于10K的文件
**locate命令**locate命令其實是find -name的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。命令格式:locate [選擇參數] [樣式]命令參數:-e:將排除在尋找的范圍之外-1:如果是1則啟動安全模式,在安全模式下,使用者不會看到權限無法看到的檔案。這會使速度減慢,因為 locate必須至實際的檔案系統中取得檔案的權限資料-f:將特定的檔案系統排除在外,例如我們沒有到必要把proc檔案系統中的檔案放在資料庫中-q:安靜模式,不會顯示任何錯誤訊息-n:至多顯示 n個輸出-r:使用正規運算式 做尋找的條件-o:指定資料庫存的名稱-d:指定資料庫的路徑-h:顯示輔助訊息-V:顯示程式的版本訊息 **whereis命令**whereis命令是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。這些文件的屬性應屬于原始代碼,二進制文件,或是幫助文件。whereis程序還具有搜索源代碼、指定備用搜索路徑和搜索不尋常項的能力。whereis命令只能用于程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。命令格式:whereis [-bmsu] [BMS 目錄名 -f ] 文件名主要參數:-b:定位可執行文件-m:定位幫助文件-s:定位源代碼文件-u:搜索默認路徑下除可執行文件、源代碼文件、幫助文件以外的其它文件-B:指定搜索可執行文件的路徑-M:指定搜索幫助文件的路徑-S:指定搜索源代碼文件的路徑 **which命令**which指令會在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。which是根據使用者所配置的PATH變量內的目錄去搜尋可運行檔的,所以,不同的PATH配置內容所找到的命令是不一樣的。命令格式:which 可執行文件名稱命令參數:-n:指定文件名長度,指定的長度必須大于或等于所有文件中最長的文件名-p:與-n參數相同,但此處的包括了文件的路徑-w:指定輸出時欄位的寬度-V:顯示版本信息總結find、locate、which、whereis的區別
which (尋找執行檔) :這個指令是根據PATH這個環境變量所規范的路徑,去搜尋執行檔的檔名,所以,重點是找出執行檔而已,which 后面接的是完整檔名
whereis (尋找特定檔案):搜尋linux數據庫檔案中所記錄的東西,和locate的主要區別在于后面的參數
locate:搜尋linux數據庫檔案中所記錄的東西,后面直接跟檔案的部分名稱就行
find:直接搜索整個硬盤
**sort命令**將文本文件內容加以排序。可針對文本文件的內容,以行為單位來排序。參數:m:將幾個排序好的文件進行合并。n:依照數值的大小排序Linux Bash中,ls . | sort 命令的功能是(顯示當前目錄內容并排序) **du命令**顯示目錄或文件的大小。du會顯示指定的目錄或文件所占用的磁盤空間。參數:a:顯示目錄中個別文件的大小。b:顯示目錄或文件大小時,以byte為單位。c: 除了顯示個別目錄或文件的大小外,同時也顯示所有目錄或文件的總和 **ls命令**顯示指定工作目錄下之內容(列出目前工作目錄所含之檔案及子目錄)。參數:a:顯示所有檔案及目錄A:同 -a ,但不列出 "." (目前目錄) 及 ".." (父目錄)t:將檔案依建立時間之先后次序列出列出目前工作目錄下所有檔案及目錄;目錄于名稱后加 "/", 可執行檔于名稱后加 "*" : ls -AF Linux Bash中,把ls命令顯示當前目錄的結果存入ls.txt的命令輸出重定向命令是(ls > ls.txt)vim gcc gdb make 的學習
詳細內容見博客:(http://www.cnblogs.com/xzh20145231/p/5907518.html)
Vim常用命令總結
插入:i:在當前光標處進行編輯a:在光標后插入編輯 退出:q!:強制退出,不保存:q:退出:wq!:強制保存并退出:wq:保存并退出:w <文件路徑>:另存為 刪除:x:刪除游標所在的字符dd:刪除整行 行間跳轉:nG(n Shift+g):光標移動到第n行 復制與粘貼:nyy:復制光標所在及其后的整行共n行p:代表粘貼至光標后 功能設定: :set autoindent(ai):設置自動縮進:set cindent(cin):設置C語言風格縮進:set nu:以顯示行號GCC編譯過程
預處理:`gcc –E hello.c –o hello.i ;gcc –E`調用cpp 產生預處理過的C原始程序編譯:`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 產生可執行文件運行:` ./hello`GDB調試
進入gdb:gcc -g xxx.c -o xxxgdb 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 行數或函數名 條件表達式參照 (http://www.cnblogs.com/lxm20145215----/p/5982554.html) 中具體gdb調試指令對棧幀進行再理解:
使用gcc - g example.c -o example -m32指令在64位的機器上產生32位匯編,然后使用gdb example指令進入gdb調試器:
進入之后先在main函數處設置一個斷點,再run一下,使用disassemble指令獲取匯編代碼,用i(info) r(registers)指令查看各寄存器的值:
可見此時主函數的棧基址為0xffffd068,用x(examine)指令查看內存地址中的值,但目前%esp所指堆棧內容為0,%ebp所指內容也為0
結合display命令和寄存器或pc內部變量,做如下設置:display /i $pc,在每次執行下一條匯編語句時,都會顯示出當前執行的語句。再分別查看每一步%esp,%ebp中值的變化情況:
call指令將下一條指令的地址入棧,此時%esp,%ebp和堆棧的值為:
將上一個函數的基址入棧,從當前%esp開始作為新基址:
先為傳參做準備:
實參的計算在%eax中進行:
f函數的匯編代碼:
實參入棧:
call指令將下一條指令地址入棧:
計算過程:
弾棧(棧頂到%ebp),pop %ebp,%esp增加4字節:
ret指令將棧頂彈給%eip:
因為函數f修改了%esp,所以用leave指令恢復。leave指令先將%esp對其到%ebp,然后把棧頂彈給%ebp:(LEAVE指令就相當于 mov esp,ebp 和 pop ebp 兩條指令的執行效果。)
主函數的匯編代碼:
makefile
功能:識別文件代碼是否更新,減少編譯工作量格式為:目標體:依賴文件[tab鍵]各目標體運行命令目標體:由make創建,通常是目標文件或可執行文件依賴文件:創建目標體所依賴的文件運行命令:創建每個目標體時需要的運行命令,必須以tab鍵開頭。使用make的格式:make 目標體計算機系統簡介
了解計算機的基本構造及各個部分之間的聯系,是對后面章節的一個概括:硬件組成等;
了解編譯器如何編譯;
了解了操作系統提供的抽象表示:文件是對I/O設備的抽象表示,進程是對處理器、主存和I/O設備的抽象表示。
鏈接
靜態庫
靜態庫是一系列的目標文件(.o文件)的歸檔文件((lib+name).a文 件);鏈接階段,選擇靜態庫,后綴名為“.a”;選擇動態庫,后綴名為“.so”。
靜態鏈接庫的生成:gcc -c 文件名.c ar rcsv libxxx.a xxx.o
靜態庫的使用:gcc -o 文件名 文件名.c -L. -lxxx//鏈接到靜態庫
注意:
-L:在庫文件的搜索路徑列表中添加dir目錄
-l:在頭文件的搜索路徑列表中添加dir目錄
共享庫
共享庫的生成:
gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享庫的使用:gcc -o main main.c -L. -lxxx
注冊共享庫的方法:將庫文件直接復制到/lib或者/usr/lib目錄下:cp (lib+name).so /lib
信息的表示和處理
詳細內容見博客: (http://www.cnblogs.com/xzh20145231/p/5928371.html)
各種進制之間的轉換以及十六進制加減法;
布爾運算求值;
位級運算的掩碼運算;
邏輯運算和位級運算的區別;
無符號數編碼;
補碼編碼;
有符號數和無符號數之間的轉換;
截斷數字的方法;
補碼的加法,補碼求非;
無符號乘法和有符號乘法;
除以二的冪:無符號:邏輯移位;補碼數:算術移位;
浮點數:IEEE浮點標準;
二進制小數;
規格化的值非規格化的值。
程序的機器級表示
用匯編語言理解指令,理解棧幀
詳細內容見博客:(http://www.cnblogs.com/xzh20145231/p/5967918.html#3534564)
了解機器級編程,學習了IA32指令集,了解指令集體系結構和虛擬地址這兩種抽象在機器級編程中的重要性:
利用object dump進行反匯編以查看匯編指令;
基本數據格式;
操作數指示符:操作數類型:立即數、寄存器、存儲器;相關尋址方式對應的格式;
根據操作數寫出對應值;
數據傳送指令(與Windows系統下指令有所區別),重點理解壓棧和弾棧操作;
加載有效地址指令leal;
控制:條件碼的設置、訪問方式;跳轉指令及其編碼;循環結構(機器級代碼理解:goto代碼);條件傳送指令;switch語句;
過程:棧幀結構;轉移控制:call指令和ret指令;寄存器使用習慣;使用gdb調試幫助理解棧幀的建立和消亡。
處理器體系結構
詳細內容見博客;(http://www.cnblogs.com/xzh20145231/p/5991005.html#3542104)
以Y86為例,指令加硬件實現(HCL語言)
Y86指令及指令編碼;(通過指令能寫出編碼,通過編碼能寫出指令)
Y86異常:值代表的含義;
體會Y86與IA32代碼的區別;
執行popl和pushl指令時處理器行為的不確定性;
組合電路和布爾表達式(HCL語言表示);
ALU算術邏輯單元;
隨機訪問存儲器的讀寫操作;
Y86的順序實現:取指、譯碼、執行、訪存、寫回、更新PC;(會寫每個階段對應的指令)
SEQ硬件結構、SEQ的時序(對應每個階段)。
存儲器層次結構
詳細內容見博客;(http://www.cnblogs.com/xzh20145231/p/6013913.html#3545642)
常見存儲技術:RAM、ROM、磁盤、固態硬盤;(區別及應用)
對比SRAM和DRAM的區別及應用;
非易失性存儲器和只讀存儲器;
訪問主存的方法:讀寫事務;
磁盤:磁盤構造;磁盤容量計算;磁盤操作:尋道時間、旋轉時間、傳送時間;邏輯磁盤塊:映射關系、三元組;訪問磁盤(連接到I/O設備);
局部性:時間局部性、空間局部性:判斷程序好壞;
利用循環體提升程序局部性;
局部性分析:
參考了這篇文章:(http://www.cnblogs.com/dxy1982/p/4194218.html),覺得分析的很好。
存儲器層次結構:高速緩存、緩存不命中。
對課程的意見或建議
謝謝老師特意發表git配置教程還有vim使用教程等指導博客,讓像我這樣動手自學能力不強的同學跟上進度!
代碼托管截圖
使用find *.|xargs wc -l查找當前目錄以及子目錄中的文件行數
托管鏈接
收獲
時間過得很快,周而復始,一個學期卻早已過半。在本門課的學習中,我自知不夠優秀,對于計算機系統的相關知識很多可能都還是一知半解,實踐能力也不算強,每次破解安裝或使用新的軟件都落于人后,但是我覺得我學習這門課最大的收獲就是:實踐才有收獲。很多時候我們不愿嘗試新事物都是因為畏難情緒,但是只要你下定決心認真去做,也一樣能做好,空有理論而不實踐等于零。
比如:之前忽視了Linux命令學習的重要性,在使用終端時感覺不便,通過本周對Linux命令的再實踐,在以后使用虛擬機終端的過程中相信會受益匪淺,再比如:通過上幾周使用git托管代碼,我發現資料備份以及分類的重要性。還有:看書時不做練習就無法真正理解新知識的核心以及涵義...
學習一門課,不只是掌握其中的相關知識,能夠學到一種學習方式、學習習慣才是最大的收獲(如老師所說的元知識,某些通用于各種學科的知識),現在也開始慢慢理解,為什么說至少要學習兩種編程語言、學習兩種操作系統才能找到所謂的不變量...學習之路,道阻且長,且學且珍惜。
不足
在前期的學習中忽略了對基本命令的實踐與掌握,所以此次總結特意加強了這部分的實踐及記憶,在使用虛擬機終端時,總是不知道對應操作的命令,每次都要去查找,所以對于重要命令的使用一定要熟記于心;在課本學習時,有時會忽略實踐的重要性,導致課本知識不能很好的被消化理解,比如:存儲其結構體系中的程序的局部性,必須要通過敲代碼運行才能直觀對比出差距...慶幸自己及時端正了態度,開始每周真正按照老師的要求去做,夯實了所學知識,繼續努力。
學習進度條
| 目標 | 30篇 | 400小時 | |
| 第一周 | 2/2 | 20/20 | 學習了Linux核心命令 |
| 第二周 | 2/4 | 21/41 | 學習了vim、gcc、gdb指令 |
| 第三周 | 2/6 | 20/61 | 學習了信息的表示和處理,了解了二進制在計算機系統中的重要性 |
| 第五周 | 2/8 | 20/81 | 學習了機器級程序,讀懂匯編代碼 |
| 第七周 | 2/12 | 18/118 | 了解了存儲器層次結構及存儲技術 |
| 第八周 | 2/14 | 15/133 | 對前幾周內容進行復習 |
轉載于:https://www.cnblogs.com/xzh20145231/p/6035460.html
總結
以上是生活随笔為你收集整理的20145231 《信息安全系统设计基础》期中总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POI导出EXCEL设置高度和宽度
- 下一篇: IrregularGridCollect