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

時間統計

預計時間(9小時30分鐘)

問題整理 1小時 
課本知識點整理 3小時
linux基礎複習 3小時 
vim等複習 1小時 
正則表達式複習 30分鐘 
分析收穫不足以及建議 1小時html

實際時間(10小時)

問題整理 2小時 
課本知識點整理 2小時
linux基礎複習 3小時30分鐘 
vim等複習 1小時 
正則表達式複習 1小時 
分析收穫不足以及建議 30分鐘linux

第一部分 知識點總結

第一章節 Linux命令

(一)man命令

man -k:程序員

經常使用來搜索,結合管道使用。例句以下:正則表達式

man -k k1 | grep k2 | grep 2算法

搜索同時含有k1和k2,且屬於系統調用。
最後的數字意味着幫助手冊中的區段,man手冊共有8個區段,最經常使用的是123,含義以下: 1.Linux 2.系統調用 3.c語言數據庫

例如:咱們輸入 man ls,它會在最左上角顯示「LS(1)」,在這裏,「LS」表示手冊名稱,而「(1)」表示該手冊位於第一節章,一樣,咱們輸入「man ifconfig」它會在最左上角顯示「IFCONFIG(8)」。也能夠這樣輸入命令:「man [章節號] 手冊名稱」。編程

man是按照手冊的章節號的順序進行搜索的,好比:vim

man sleep數組

只會顯示sleep命令的手冊,若是想查看庫函數sleep,就要輸入:緩存

man 3 sleep

即查找c語言中printf的用法。

cheat

cheat命令:告訴你一個命令如何使用。經過使用實例告訴你一個命令如何使用。 
用法:cheat 命令名

find locate which whereis的用法和區別

一、find用法

find是查找命令,find查找磁盤空間 
find的使用格式以下: 
  $ find <指定目錄> <指定條件> <指定動做> 
  - <指定目錄>: 所要搜索的目錄及其全部子目錄。默認爲當前目錄。 
  - <指定條件>: 所要搜索的文件的特徵。 
  - <指定動做>: 對搜索結果進行特定的處理。 
舉例:

$ find . -type f -mmin -10

  搜索當前目錄中,全部過去10分鐘更新過的普通文件。若是不加-type f參數,則搜索普通文件+特殊文件+目錄

二、locate命令

locate命令是"find -name"的另外一種寫法,但更快,緣由在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地全部文件信息。在使用locate以前,先使用updatedb命令,手動更新數據庫。 
locate命令的使用實例:

  $ locate /etc/sh 
  搜索etc目錄下全部以sh開頭的文件。 
  $ locate ~/m
  搜索用戶主目錄下,全部以m開頭的文件。 
  $ locate -i ~/m 
  搜索用戶主目錄下,全部以m開頭的文件,而且忽略大小寫。

三、whereis

whereis命令只能用於程序名的搜索,並且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。若是省略參數,則返回全部信息。同locate同樣,查詢數據庫(/var/lib/locatedb)文件。 
whereis命令的使用實例:

  $ whereis grep

四、which

which命令的做用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,而且返回第一個搜索結果。也就是說,使用which命令,就能夠看到某個系統命令是否存在,以及執行的究竟是哪個位置的命令。 
which命令的使用實例:
 

 $ which grep

區別

which (尋找執行檔) :這個指令是根據PATH這個環境變量所規範的路徑,去搜尋執行檔的檔名,因此,重點是找出執行檔而已,which 後面接的是完整檔名 
whereis (尋找特定檔案):搜尋linux數據庫檔案中所記錄的東西,和locate的主要區別在於後面的參數 
locate:搜尋linux數據庫檔案中所記錄的東西,後面直接跟檔案的部分名稱就行 
find:直接搜索整個硬盤

apt-cache search

經常使用使用方法

一、apt-cache show package_name: 顯示指定軟件包的信息,包括版本號,安裝狀態和包依賴關係等.

二、apt-cache search package_name:搜索軟件包,能夠按關鍵字查找軟件包,一般用於查詢的關鍵字會使用軟件包的名字或軟件包的一部分.

三、apt-cache showpkg package_name:顯示軟件包的依賴關係信息.

四、apt-cache stats:顯示當前系統所使用的數據源的統計信息,用戶可使用該命令查看數據源的相關統計信息.

五、apt-cache policy package_name:顯示軟件包的安裝狀態和版本信息.

六、apt-cache depends package_name:顯示指定軟件包所依賴的軟件包。當用戶須要瞭解某個軟件包依賴於其餘哪些包時,可使用apt-cache depends來查詢包依賴關係.

七、apt-cache rdepends package_name:查詢指定軟件包的反向依賴關係,即那些其餘的軟件包須要依賴你所指定的軟件包作爲安裝和運行的必須條件.

八、apt-cache dump:顯示緩存中的每一個軟件包的簡要描述信息.

九、apt-cache unmet:顯示不符合一致性的依賴關係.

cat

命令說明: 查看文件內容,也能夠給文件追加內容到結尾 
語法:cat [-AbEnTv]

參數: 
-A :至關於-vET的整合參數,能夠列出一些特殊字符,而不是空白而已 -b :列出行號,僅對非空行號顯示,空白行不標記行號 
-E :將結尾的斷行字符$顯示出來
-n :打印出行號,連同空白行也有行號,與-b參數不一樣 
-T :將[tab]按鍵以^I 顯示出來 
-v :列出一些看不出的特殊字符

touch

命令功能:
touch命令參數可更改文檔或目錄的日期時間,包括存取時間和更改時間。 
命令格式:
touch [選項]... 文件...
命令參數:

-a 或--time=atime或--time=access或--time=use  只更改存取時間。
-c 或--no-create  不創建任何文檔。
-d  使用指定的日期時間,而非如今的時間。
-f  此參數將忽略不予處理,僅負責解決BSD版本touch指令的兼容性問題。
-m 或--time=mtime或--time=modify  只更改變更時間。 
-r  把指定文檔或目錄的日期時間,通通設成和參考文檔或目錄的日期時間相同。
-t  使用指定的日期時間,而非如今的時間。

正則表達式

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

\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, }

匹配方法:

^ 從字符串開始的地方匹配
$ 從字符串結束的地方匹配
| 能夠匹配左或者右

貪婪模式 :儘量多的匹配
非貪婪模式 :儘量少的匹配

grep

這條語句能夠用來查找關鍵字,全文搜索,而且能夠直接查找文件內的內容。其中:

n:爲顯示行號

r:爲遞歸查找

例如,若是想查找某個宏,咱們已知宏保存在include文件夾中,因此可使用下列語句:

grep -nr XXX /usr/include(XXX爲所要找的宏)

第二章節 vi、 gcc、gdb、make的使用

vim編輯器:編寫代碼

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

注意:
gcc的通常格式爲: 
gcc [選項] 要編譯的文件 [選項] [目標文件],
其中,目標文件可默認,gcc默認生成可執行的文件,名爲編譯文件.out.

靜態庫

靜態庫是一系列的目標文件(.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

gdb調試器:調試代碼

(1)使用流程

查看文件:l 
設置斷點:在b後加入相對應的行號。例b 6 
查看斷點狀況:設置完斷點後鍵入info b,在gdb中能夠設置多個斷點。bt 查詢調用函數的狀況。 
運行代碼:默認從首行開始運行代碼,鍵入r;r+行號:從該行號開始運行 查看變量值:p 變量。例:p n 
單步運行:n或s,s會進入函數,n不會進入函數 
恢復程序運行:c
注意:程序的運行狀態有「運行」、「暫停」、「中止「三種。

(2)斷點的設置

函數:b 文件名.c:函數名

行:b 行數

條件:b 行數 if 表達式(b 8 if == 10)

臨時:tb [文件名:]行號或函數名 <條件表達式>

make項目管理器

功能 :識別文件代碼是否更新,減小編譯工做量

(1)makefile文件的編寫規則

格式爲:

目標體:依賴文件

[tab鍵]各目標體運行命令

目標體:由make建立,一般是目標文件或可執行文件

依賴文件:建立目標體所依賴的文件

運行命令:建立每一個目標體時須要的運行命令,必須以tab鍵開頭。

使用make的格式:make 目標體

(2)makefile變量的定義

遞歸展開方式:在引用該變量時進行替換(不能用於引用本身的狀況),缺點:不能在變量後追加內容。

格式定義:VAR = var

非遞歸展開方式:在定義處展開,並只展開一次。優勢:消除變量的嵌套引用。

格式定義:VAR := var

make中變量的使用格式: $(變量名)

變量名的命名:不包括「:」、「#」、「=」以及結尾空格的任何字符串;變量名大小寫不敏感。

變量分類:用戶自定義變量、預約義變量、自動變量及環境變量。

(3)makefile規則

隱含規則

模式規則

第三章節 教材內容

第一章

一、信息就是位+上下文 
二、計算機系統的核心是高速緩存的概念,一層存儲器是低一層存儲器的高速緩存。
三、操做系統中的抽象是進程、文件、虛擬存儲器、虛擬機。

第二章

一、數字的三種表示 :無符號數、有符號數、浮點數 
二、進制轉化 
(1)x=2^n轉化爲十六進制 
將x寫成x=2^n的形式,令n=i+4j,x的十六進制表示爲:開頭爲2^i的值,後面補j個0。 
三、字和字節順序 
字長:一個字長指明整數和指針數據的標稱大小。字長決定最重要的系統參數就是虛擬地址空間的最大大小。對一個字長爲w位的機器而言,虛擬地址的範圍是0~2^w-1,程序最多訪問2^w個字節。 
對於跨越多字節的程序對象需創建兩個規則: 
小端法:高對高,低對低 
大端法:從視覺上,是此次閱讀的順序,與小端法相反。 
使字節順序變得可見的三種方式: 
不一樣類型的機器之間經過網絡傳送二進制數據時,網絡應用程序的代碼編寫必須遵照已創建的關於字節順序的規則; 
使用反彙編器,處理整數數據的字節序列的存儲字節順序問題; 
當編寫規避正常的類型系統的程序時。 
四、布爾代數 
(1)位向量的運算:按位運算 
(2)位向量的應用:表示有限集合 
掩碼錶示的是設置爲有效信號的集合。 
(3)位級運算 
|:或 
&:與 
~:取反 
^:異或 
掩碼運算:掩碼是一個位模式,表示從一個字中選出的位的集合。例如:位級運算x&0xFF生成一個有x的最低有效字節組成的值。 
(4)邏輯運算 
邏輯運算符:||(或)、&&(與)、!(非) 
(5)移位運算 右移包括:邏輯右移、算數右移 
邏輯右移:左端補k個0(經常使用於無符號數) 
算數右移:左端補k個最高有效位的值(用於有符號數) 
五、補碼編碼

補碼形式是最多見的有符號數的計算機表示方式 將字的最高有效位解釋爲負權 B2T(W)函數爲:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和從i=0到i=w-2)

六、有符號數和無符號數之間的轉換

負數和正數相等的狀況:u=2147483648 =-2147483648
(當輸出分別爲無符號形式和有符號形式時)

七、擴展數的位表示 
零擴展:將無符號數轉換爲更大的數在表示的開頭添加0
符號擴展:將一個補碼數字轉換爲一個更大的數據類型
 
八、截斷數字 
截斷數字:不用額外的位來擴展一個數值,而是減小表示一個數字的位數。

注意!!補碼通過截斷處理後的結果還是補碼,注意結果爲負數時轉化爲十進制數

九、使用無符號數的狀況 
(1)把字僅僅看作是位的集合,並無任何數字意義時 
(2)當實現模運算和多精度運算的數學包時,數字是由數的數組來表示的,無符號值也會很是有用。
十、整數運算 
(1)無符號加法 
(2)補碼加法 
(3)補碼的非 
(4)無符號乘法 
兩個數x、y相乘且x、y的位數爲w,則結果的位數爲2w。 
(5)補碼乘法 
同無符號乘法。 若爲截斷後的結果,則取結果的後w位做爲計算結果。 注意:無符號運算和補碼運算在「+」、「-」、「」在位級上有相同的結果。 
(6)乘以常數 
對於某個常數K的表達式x
K生成代碼,編譯器會將K的二進制表示表達爲一組0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)] 能夠用如下兩種形式來計算這些乘積的結果:

A:(x<<n)+(x<<n-1)+……+(x<<m) 
B:(x<<n+1)-(x<<m) 
注意:對於n爲最高位的狀況,B:-(x<<m) 
注意!!(x<<0)的結果是x,而不是0

(7)除以2的冪 
設x/K,令K=2^n, 
當x爲正數時,計算 x>>n; 
當x爲負數時,將x加上偏置量,即加上2^n-1(即K-1),計算** (x+偏置量)>>n**。 
十一、浮點數 
(1)二進制小數 
將十進制小數轉換爲二進制小數 
首先,將十進制小數寫成分數的形式,將分數的分子部分,寫成二進制的形式;將分數的分母部分寫成2^n的形式,將分子的二進制形式,從右往左數,數n位添加小數點。 
小數點左移:除以2 
小數點右移:乘以2
 
(2)IEEE浮點數表示 
表示形式爲:V = (-1)^s * M * 2^E 
符號:s符號位。 
尾數:M是一個二進制小數,它的範圍是1 ~ 2-ε,或者是0 ~ 1-ε。 
階碼:E的做用是對浮點數據加權,這個權重是2的E次冪(多是負數)。 
根據階碼的值,可分爲一下三種狀況: 
狀況一:規格化的值 (當階碼字段不全爲0或全爲1時) 
E = e-Bias 
Bias = 2^(k-1)-1 
M = 1+f 
狀況二:非規格化的值 (當階碼字段全爲0時)
E = 1-Bias
Bias = 2^(k-1)-1 
M = f
狀況三:特殊值 (當階碼字段全爲1時)
當小數域全爲0時, 當s=1時,爲-∞;當s=0時,爲+∞。
當小數域不全爲0時,爲NaN。 
(3)浮點數的舍入 
有四種狀況分別是:向偶數舍入(默認)、向零舍入、向下舍入、向上舍入。 
(4)浮點運算
浮點加法:不知足結合性、知足單調性 浮點乘法:不知足結合性、知足單調性,在加法上不知足分配性

第三章

一、反彙編命令 objdump -d xxx.o 
二、執行彙編命令:gcc –s xxx.c –o xxx.s
三、64位處理器獲得32代碼的命令:gcc –m32 –s xxx.c
四、三種操做數:當即數、寄存器、存儲器
五、條件碼 : CF:進位標誌 ZF:零標誌 SF:符號標誌 OF:溢出標誌
六、jump指令:直接跳轉——後面跟標號做爲跳轉目標; 間接跳轉——*後面跟一個操做數指示符
七、傳送指令包括:數據傳送指令和條件傳送指令 
八、call指令的效果是將返回地址入棧。並跳轉到被調用過程的起始處。 
九、ret指令返回到call指令後的那條指令
十、leave指令可使棧作好返回的準備 等價於:
movl %ebp,%esp ; popl %ebp

第四章

一、指令體系結構:一個處理器支持的指令和指令的字節級編碼
二、程序員可見狀態:8個寄存器狀態、程序計數器PC。 
三、指令集的一個重要性質:字節編碼必須有惟一的解釋。
四、Y86異常:狀態碼1,AOK,程序正常; 狀態碼2,HLT,處理處執行halt指令; 狀態碼3,ADR,非法地址;狀態碼4,INS,非法指令。 
五、建立Y86代碼的惟一工具是彙編器 ;YIS:指令集模擬器 六、pushl指令會把棧指針減4,而且將一個寄存器值寫入存儲器中。 
七、SEQ執行處理一條完整指令的步驟:取址、譯碼、執行、訪存、寫回、更新 
八、nop指令:除了將PC加1,不進行任何處理; halt指令:將處理器狀態設置爲HLT,致使處理器中止運行。
九、取址階段包括指令存儲器硬件單元。
instrvalid:指示指令是否合法 needregids:指示是否包括一個寄存器指示符字節 need_valC:指示是否包括一個常數字 instrvalid和imemerror在訪存階段被用來產生狀態碼。
十、「cond」硬件單元會根據條件碼和功能碼來肯定是否進行條件分支或者條件數據傳送。

第六章

一、隨機訪問存儲器分爲:靜態的SRAM、動態的DRAM
二、根據攜帶信號不一樣,總線可分爲數據總線、地址總線、控制總線。 
三、計算磁盤容量的公式:
磁盤容量 = 字節數/扇區 X 平均磁盤數/磁道 X 磁道數/表面 X 表面數/盤片 X 盤片數/磁盤
四、訪問時間=尋道時間+旋轉時間+傳送時間 
五、最大旋轉延遲=1/RPM X 60secs/1min (s) ;平均旋轉時間是最大旋轉時間的一半
六、平均傳送時間= 1/RPM x 1/(平均扇區數/磁道) x 60s/1min
七、邏輯磁盤塊三元組(盤面,磁道,扇區):惟一地標示了對應的物理扇區
八、CPU使用一種稱爲存儲器映射I/O的技術來向I/O設備發出命令。
九、局部性包括時間局部性和空間局部性。
十、循環有好的時間和空間局部性 
十一、高速緩存:上一層作下一層的高速緩存 
十二、緩存不命中的種類 
冷緩存(強制不命中\冷不命中):一個空的緩存,對於有效位爲0的狀況 ; 容量不命中:當工做集的大小超過緩存的大小時;衝突不命中:限制性的放置策略會引發的一種不命中。
1三、每一個存儲器地址有m位,造成M=2^m個不一樣的地址; 高速緩存組:S = 2^m個高速緩存組的數組 ; 高速緩存行:B = 2^m字節的數據塊組成 ; 有效位:指明這個行是否包含有意義的信息; 標記位:惟一地標識存儲在這個高速緩存行中的塊,t = m -(b+s) 
1四、高速緩存參數的性能影響
緩存大小的影響;塊大小的影響;相聯度的影響;寫策略的影響

第七章

一、c語言程序執行的過程涉及的工具:c預處理器(cpp)、編譯器(cc1)、彙編器(as)、連接器程序(ld) 
二、連接器的任務:符號解析、重定位 
三、目標文件的三種形式:可重定位目標文件、可執行目標文件、共享目標文件
四、目標文件的格式:a.out、COFF、DE、ELF
五、連接器上下文的三種符號:全局符號、外部符號、本地符號

第四章節 考題

第三週

填空:實驗樓環境中全部的默認系統用戶名和密碼均爲(shiyanlou)。
填空:Linux Bash中,Ctrl+a快捷鍵的做用是(將光標移至輸入行頭,至關於Home鍵)。
判斷:Linux Bash中, man printf和man 1 printf 功能等價。 ok
填空:在 Linux 裏面可使用使用(groups)命令知道本身屬於哪些用戶組。 
填空:在 Linux 裏面可使用使用(chmod)命令修改文件的權限。
填空:Linux中沒有C盤,D盤,其文件系統的目錄是由(FHS)標準規定好的。 
判斷:Linux Bash中,cd - 命令能夠切換到'home'目錄。 x 應該是cd ~ , cd -切換到上一個目錄 
判斷:Linux Bash中,強制刪除test文件的命令是(rm -f test )。

判斷:Linux Bash中,cat -n 和 nl 命令功能等價。ok

判斷:Linux Bash中,source 和 . 命令功能等價。 ok

填空:Linux Bash中,查找home目錄中前天建立的文件的命令是(find ~ -ctime 2)。 區分 2 +2 -2 的意義, 三種時間參考學姐李冰清的研究 
判斷:Linux Bash中,使用tar命令把home目錄打包成home.tar的命令是( tar -cf home.tar ~)
填空:Linux Bash中,zip命令使用(-e)參數能夠建立加密壓縮包。 
判斷:Linux Bash中,df和 du 命令功能等價。x
填空:Linux Bash中,ls . | sort 命令的功能是( 顯示當前目錄內容並排序)

填空:Linux Bash中,使用grep查找當前目錄下*.c中main函數在那個文件中的命令是( grep main *.c )
填空:Linux Bash中,使用wc統計hello.c共有幾行代碼的的命令是( wc -l hello.c)
判斷:col 命令的-h參數能夠將Tab換成對等數量的空格建。x ,空格換tab
填空:Linux Bash中,把ls命令顯示當前目錄的結果存入ls.txt的命令輸出重定向命令是(ls > ls.txt)
填空:Linux Bash中,(tee)命令能夠同時重定向到多個文件。

第四周

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

cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )

find 填空:查找當前目錄下全部目錄的find命令是(find . -type d)
grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)
CH01填空:計算機系統中的全部信息都是位串表示的,所謂(信息)就是位+上下文。
CH01填空:存儲器層次結構的主要思想是上層存儲器做爲下層存儲器的(高速緩存)。
CH01填空:操做系統中最基本的四個抽象是(虛擬機、進程、虛擬存儲器、文件)。
CH07填空:連接器的兩個主要任務是(符號解析和重定位)。
CH07選擇:教材p449中 swap.c中的bufp1 是( A ) A 全局符號 B外部符號 C本地符號 D以上都不對
CH07 判斷:C語言中,全局變量是強符號。(X)
CH07 填空:(加載器)將可執行文件的內容映射到存儲器,並運行這個程序。
CH07 選擇:Linux中,反彙編.text節中的二進制指令使用的工具是(d)A ar B strings C readelf D objdump

實驗題

一、 在vi中,查看scanf和printf man pages(幫助文檔)的命令分別是?(2分) K 3K 二、 編譯和運行以上代碼的命令(2分)

gcc *.c -o main ./main 三、 使用GDB調試以上代碼:編譯代碼的命令是?main.c中如何給main函數設置斷點?如何在第六行設置斷點?(3分)
gcc -g *.c -o main 
b main 
b 6

四、 除了main.c外,其餘4個模塊(add.c sub.c mul.c div.c)的源代碼不想給別人,如何製做一個mymath.a靜態庫?main.c如何使用mymath.a?(3分)

gcc -c add.c sub.c mul.c div.c
ar rcvs libmymath.a add.o sub.o mul.o div.o

gcc main.c -o main -L. -lmymath
( gcc main.c ./libmymath.a -o main)

五、 除了main.c外,其餘4個模塊(add.c sub.c mul.c div.c)的源代碼不想給別人,如何製做一個mymath.so共享庫?main.c如何使用mymath.so?(4分)

gcc -fPIC -c add.c sub.c mul.c div.c
gcc -shared -o libmymath.so add.o sub.o mul.o div.o

gcc -o main main.c -L. -lmymath

libmymath.so 要拷貝到/lib or /usr/lib

六、 寫出編譯上面代碼的makefile,編譯出來的目標文件爲testmymath, 只用顯式規則就能夠.(4分)

testmymath: main.o add.o sub.o mul.o div.o 
gcc main.o add.o sub.o mul.o div.o -o testmymath
main.o: main.c head.h
gcc -c main.c
add.o: add.c head.h
gcc -c add.c
sub.o: sub.c head.h
gcc -c sub.c
mul.o: mul.c head.h
gcc -c mul.c
div.o: div.c head.h
gcc -c div.c

第五週

man -k 填空:Linux中顯示文件(file )屬性(status)的命令是( stat )

cheat 填空:使用du命令對當前目錄下的目錄或文件按大小排序的命令是( du -sk | sort -rn ) 
grep 填空:~/test 文件夾下有不少c源文件,查找main函數在哪一個文件中的命令( grep main.c )

vi 填空: vi中查看函數qsort的幫助文檔的快捷鍵爲(K)

gdb 判斷: gdb中next和step均可以單步跟蹤,根據自頂向下原則應該優先選用step. (X )

ch01 填空:抽象是CS中一個重要的概念,在出來器裏,(指令集結構)提供了對實際處理器的抽象。 
ch01 選擇:並行的三個層次不包含(C)。A 線程級併發 B指令級並行 C進程級併發 D SIMD 
ch07 填空:gcc -f PIC xxx.c中的PIC的意思是(位置無關的代碼 or Position-Independent Code 
2.4 填空:計算 0x503C + 100 = ( 0x50A0 ) ,結果用16進製表示 
2.6 填空:練習2.6中匹配的二進制共21位,用16進製表示是( 0x159141 ) 
2.8 填空: a,b長度都是一個字節,a=1,b=6, a|b = ( 7 or [00000111] ) 
2.11 判斷: 代碼中第四行 "<=" 換成「>=」 就能夠解決代碼問題.(X) 
2.13 判斷: 
//compute x&y, only calls to functions bis and bic. (X)

int bool_and(int x, int y)
{  
    int result = bic(x, y);  
    return result;  
}

2.14 填空:a,b長度都是一個字節,a=1,b=6, a||b = ( 1 or true ) 
2.18填空:16位機器上,補碼0x8004轉化等值的十進制是(-2044) 
2.19 判斷:T2U4(-8) + 8 = 16 (OK) 
2.21 判斷:C語言中: -2147483647-1U < -2147483647 ( ok )
2.23 填空:fun2(0xED005380) = (0xFFFFFF80)
2.24 填空:四位數0xC 截斷爲3位數,解釋爲無符號數的截斷值是(4) 
2.25 判斷:代碼for中條件 i<=(int) length -1 能夠消除程序bug ( ok ) 
2.27 判斷: 函數代碼能夠是 ruturn x+y >= y; (ok) 
2.29 填空: [11000] + [11000] = ([110000]) 
2.33 填空:對於四位數補碼8,其補碼的非表示爲十進制爲(-8)
2.34 填空:補碼 [100] * [101] = ([001100])
2.40 填空:K=31 移位2,加/減1,表達式爲((x<<5)-x)
2.44 判斷: 針對題目:(x>0)|| ((x-1)<0)的值爲真 (x)
2.45 填空:二進制小數1.101轉化爲十進制爲(1.625)
2.47 判斷:浮點數 00111轉化爲十進制爲1.5 (X)
2.50 填空:二進制數10.110舍入到最接近的二分之一的十進制的值爲(2.5)
2.54 判斷: f== -(-f) (ok)

第六週 第三章

regex 判斷: 正則表達式r.t能夠匹配rt. (x)
regex 判斷:正則r表達式zo
能夠匹配z. (ok)
*
***CH03 填空:從i386開始,x86體系結構擴展到了32位,增長了(平坦)尋址模式 *** CH03 填空:在64位機器上,要用gcc編譯出32位機器碼,須要使用(-m32) 選項 
CH03 填空:對於機器級編程來講,兩種重要的抽象是(ISA,虛擬地址) 
CH03 填空:Linux中,對目標代碼code.o進行反彙編的命令是(objdump -d code.o)
CH03 填空:IA32指令中,操做數的三種類型是(當即數、寄存器、存儲器) 
3.1 填空: 針對練習3.1中的圖,操做數 8(%eax,%ecx,4)的值是(0x11) 
***CH03 判斷: 把內存中地址爲0x4050處的字複製到地址爲0x405c處的指令是 movw ($0x4050) ,($0x405c) (x) *** 
CH03 判斷: %esp的值爲0x10c, pushl %eax後,%esp的值爲0x108. (ok) 
3.3 判斷: movb $0xF, (%eax) 是正確彙編語句. (ok) 
3.5 填空: decode1函數的功能是( 數據交換 ) 
3.6 填空: 指令leal 3(%eax,%ecx,4), %edx 存儲在%edx中的值爲( 3+x+4y ) 
3.9 填空: arith函數的功能是( ~((x^y)>>3) -z ) 
3.14 判斷: 彙編代碼不會記錄程序值的類型。(ok) 
CH03 填空:C語言中的條件表達式在彙編中是結合(有條件跳轉和無條件跳轉)實現的。 
CH03 填空:C語言中的循環結構能夠用(條件測試和跳轉組合起來)實現。 
CH03 選擇:棧用來(ABCD) A 傳遞參數 B 存儲返回信息 C保存寄存器 D本地存儲。

CH03 填空:Linux彙編中,造成空調用棧幀的語句是(push %ebp movl %esp %ebp)

CH03 填空:Linux彙編中,函數有返回值存在( %eax )寄存器中。

第七週 第四章

find: 填空:查找當前目錄下2天前被更改過的文件 (find . -mtime +2 -type f -print) 
CH04 判斷:Y86中,程序員的可見狀態包括PC。(ok)

CH04 判斷:Y86中,有5個雙字節指令。(x)

4.1 Y86中 jmp 0x100 對應的機器碼是(0x7000010000) 
4.2 Y86中 0xa00f 對應的彙編語句是(pushl %eax)
CH04 判斷:Y86中,狀態碼INS表示遇到非法指令。(ok)
CH04 填空:建立Y86代碼惟一的工具是(彙編器 or YAS)

4.6 判斷:Y86中,pushl壓入棧的是減去4的%esp的值。(x)

CH04 填空:實現一個數字系統須要三組成部分(組合邏輯、存儲器元素、時鐘信號)。
CH04 填空:HCL表明(Hardware Control Language, 硬件控制語言) 
4.8 填空:xor的HCL表達式是(bool xor = (!a &&b) ||(a && !b)) CH04 填空:HCL表達式bool Eq = (A==B)的功能是(判斷字A、B是否相等) 
4.10 填空:寫出HCL代碼,求輸入字A、B中的最小值( 注意是兩個 ) 
CH04 填空:Y86中,使用時鐘寄存器保存程序計數器PC、條件代碼CC和(程序狀態Stat) 
CH04 填空:Y86中,指令執行分爲六個階段(取指、譯碼、執行、訪存、寫回、更新PC) 
CH04 填空:Y86中對於PC值p=100,指令包括一個寄存器指示符字節和,常數1,增長器產生值(106) 
4.17 填空:實現HCL代碼,須要查看教材第( 232 )頁的圖。 
CH04 填空:p266, icode == IOPL :ifun; 的功能是(加減與異或運算的選擇) 
4.24 填空:mem_write中爲何有IRMMOVL( 寄存器往內存寫 )

第八週 第六章

CH06 判斷: SRAM比DRAM快。(ok) 
CH06 判斷:EEPROM能夠用紫外線進行擦除。(x)
CH06 填空:根據攜帶信號不一樣,總線可分爲(數據總線、地址總線、控制總線)三種。 
6.2 填空:計算磁盤容量(327.68G):4個盤片,100000個柱面,每條磁道800個扇區,每一個扇區512個字節。
CH06 填空:對磁盤扇區的訪問時間包括三個部分(尋道時間、旋轉時間、傳送時間)。
6.3 填空:最大旋轉時間是(4ms)。
CH06 填空:邏輯磁盤塊的邏輯塊號能夠翻譯成一個(盤面、磁道、扇區)三元組。
CH06 填空:CPU使用(存儲器映射I/O)技術向I/O設備發出命令。 
CH06 填空:局部性有兩種形式(時間局部性、空間局部性)。
CH06 判斷:程序訪問一個向量,步長越大空間局部性越好。(x)

CH06 判斷:程序中的循環語句具備良好的時間局部性和空間局部性(ok)

6.8 填空:只修改第八行,讓程序具備良好的空間局部性。改成:( sum +=a[i][j][k] )
CH06 填空:存儲層次結構的中心思想是(上層做爲下層的緩存)。 
CH06 填空:緩存不命時,決定哪一個塊是犧牲塊由(替換策略)來控制。 
CH06 填空:空緩存的不命中叫(強制性不命中或冷不命中) 
CH06 填空:容量不命中的緣由是(緩存過小) 
CH06 填空:高速緩存結構能夠用元組(S,E,B,m)來描述。 
6.10 填空:高速緩存容量爲1024,高速緩存結構爲(( 32 ),4,8,32) 
6.11 填空:3/4的命中率的如何計算的((32-8)/32,或每4次有一次不命中)
CH06 判斷:存儲器山中山脊表明空間局部性。(x)

第二部分 收穫

1.站在全局的角度,從新理解計算機系統。從新複習了計算機導論、彙編、c語言的相關知識,感受本身對知識的理解有了更深的認識。
二、學習了linux的相關命令,這能夠說是元知識,可是,我學習的不太紮實,若是能夠常用,可能會掌握的更熟練。
三、學習了vim、gcc、gdb、makefile等工具,這樣能夠爲以後的學習打下紮實的基礎,後來我發現gdb在緩衝區漏洞攻擊中也有很大的做用。
四、瞭解計算機如何將高級語言轉換爲低級語言,就是彙編語言,又把低級語言轉化成立機器語言,就是01代碼,在第四章的學習中,我經過學習Y86系統,對計算機的工做原理有了深入的認識。 五、掌握了自學的方法,也學會了本身解決遇到的問題,這多是除了收穫知識之外最大的收穫。在遇到其餘學科的問題時,我也有了一套本身搜索得到解決辦法的方法,這能夠說是學會捕魚的方法,而不僅是獲得了魚。

第三部分 不足

一、第一週的學習,因爲當時在電子實習,而且參加了一些活動,沒有很好的準備,只是囫圇吞棗的看了一下,包括實驗只是照着作了一下,作完很快就忘了,這也是我剛開始基礎沒打好,後面用到的時候,要不斷的現查。 
二、對學習的內容沒有複習,只是學一遍,考試以前大致看一下,沒有作到把書看不少遍,因此理解還只是很淺層,但有以前課程的基礎,還不至於看不懂,可是更深刻的部分,也不能熟練掌握。 
三、有時候有一些擴展資料,沒有好好閱讀,就是把它當小說看了,也沒太過腦子。
四、仍是應該一步一個腳印慢慢來,就好比說第一週的linux基礎的學習,當時爲了按時完成任務,看的很浮躁固然也很快,然而這樣看完了一遍心裏以爲已經看過了,但以後就是不想再看一遍了,可能就是當時看的時候潛意識裏以爲看的很痛苦,因此從一開始就不能糊弄,想遇上也不是那麼輕鬆的。
五、面對各類各樣的要求,總是不能作到面面俱到,老是拆了東牆補西牆的,這少一點,那少一點,仍是應該態度更加端正一些!!!
六、說到底,最大的問題就是浮躁,就是能不能沉下心去學,能不能拒絕周圍的誘惑,仍是應該更認真一些!!!

第四部分 課程建議和意見

一、感受老師那裏有不少經驗和技術,但願老師上課能夠多講一些,一些實用的技巧,我以爲老師以前讓咱們看的課本的部分,真的就是知識部分,就是想自學的人能夠經過百度直接獲得的部分,咱們如今是瞭解這些知識,但毫不是深刻透徹的理解,畢竟學一遍,並且是自學的,程度確定是不同的,因此仍是想能多聽一聽老師講的:)

參考資料

一、《深刻理解計算機系統》課本

二、實驗樓實驗指導書:https://www.shiyanlou.com/courses/413 實驗

三、每週重點:http://group.cnblogs.com/topic/73069.html

四、往期博客http://i.cnblogs.com/

五、Linux man命令的使用方法http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html

相關文章
相關標籤/搜索