第一章 計算機系統漫遊shell
(每小節基本內容歸納)vim
1.1 信息就是位+上下文緩存
文本文件:由ASCII字符構成的文件安全
二進制文件:其餘文件服務器
在不一樣的上下文中,一個一樣的字節序列可能表示不一樣信息網絡
1.2 程序被其餘程序翻譯成不一樣的格式多線程
從源文件到目標文件的轉化是由編譯器驅動程序完成gcc -o hello hello.c
併發
編譯系統:預處理器、編譯器、彙編器和連接器編輯器
預處理階段:.c->.i
,根據以字符#開頭的命令,修改原始的C程序函數
編譯階段:.i->.s
,彙編語言程序
彙編階段:.s->
機器語言指令,打包成可重定位目標程序
連接階段:可重定位目標程序->可執行目標程序
1.3 瞭解編譯系統如何工做是大有益處的
知道編譯系統是如何工做的:優化程序性能、理解連接時出現的錯誤、避免安全漏洞
1.4 處理器讀並解釋存儲在存儲器中的指令
shell命令行解釋器,輸入的命令行第一個單詞不是內置的外殼命令,那麼外殼就會假設這是一個可執行文件的名字
1.4.1 系統的硬件組成
總線:貫穿整個系統的一組電子管道,攜帶信息字節並負責在各個部件間傳遞
I/O設備: 系統與外界的聯繫通道,經過一個控制器或適配器與I/O總線相連
主存:臨時存儲設備,處理器執行程序時,用來存放程序和程序處理的數據,由一組動態隨機存取存儲器(DRAM)芯片組成
處理器:中央處理單元(CPU),解釋(或執行)存儲在主存中的指令的引擎
1.4.2 運行hello程序
1.5 高速緩存相當重要
高速緩存存儲器:靜態隨機訪問存儲器(SRAM)實現
1.6 存儲設備造成層次結構
每一個計算機系統中的存儲設備都被組織成了一個存儲器層次結構
一層上的存儲器做爲低一層存儲器的高速緩存
1.7 操做系統管理硬件
操做系統兩個基本功能:1)防止硬件被失控的應用程序濫用 2)嚮應用程序提供簡單一致的機制來控制複雜而截然不同的低級硬件設備
操做系統經過幾個基本的抽象概念(進程、虛擬存儲器和文件)來實現這兩個功能
1.7.1 進程
對處理器、主存和I/O設備的抽象表示
進程是操做系統對一個正在運行的程序的的一種抽象
併發運行:一個進程的指令和另外一個進程的指令是交錯進行的
上下文切換:操做系統實行交錯執行的機制
1.7.2 線程
一個進程實際上能夠由多個稱爲線程的執行單元組成,每一個線程都運行在進程的上下文中,並共享一樣的代碼和全局數據
1.7.3 虛擬存儲器
虛擬存儲器是一個抽象概念,爲每一個進程提供了一個假象,即每一個進程都在獨佔地使用主存
每一個進程看到的是一致的存儲器,稱爲虛擬地址空間
程序代碼和數據:代碼和數據區是直接按照可執行目標文件的內容初始化的
堆:堆能夠在運行時動態地擴展和收縮
共享庫:存放共享庫的代碼和數據的區域
棧:位於用戶虛擬地址空間頂部的是用戶棧,編譯器用他實現函數調用,用戶棧在程序執行期間能夠動態地擴展和收縮
內核虛擬存儲器:內核老是駐留在內存中,是操做系統的一部分,地址空間頂部區域爲內核保留
1.7.4 文件
文件是字節序列,I/O設備的虛擬表示
系統中的全部輸入輸出都是經過使用一小組稱爲Unix I/O的系統函數調用讀寫文件來實現的
1.8 系統之間利用網絡通訊
1.9 重要主題
1.9.1 併發和並行
併發:一個同時具備多個活動的系統
並行:用併發使一個系統運行得更快
線程級併發:多處理器系統(由單操做系統內核控制的多處理器系統)要求程序是以多線程的方式來書寫的,這些線程也能夠並行的高效執行
指令級並行:現代處理器能夠同時執行多條指令的屬性 超標量處理器:處理器能夠達到比一個週期一條指令更快的執行速率
單指令、多數據並行:容許一條指令產生多個能夠並行執行的操做
1.9.2 計算機系統中抽象的重要性
第七章 連接
連接:將各類代碼和數據部分收集起來並組合成爲一個單一文件的過程,文件能夠被加載到存儲器並執行
7.1 編譯器驅動程序
7.2 靜態連接
連接器兩個主要任務:符號解析、重定位
7.3 目標文件
可重定位目標文件:包含二進制代碼和數據
可執行目標文件:可直接被拷貝到存儲器並執行
共享目標文件:特殊類型的可重定位目標文件,能夠在加載或者運行時被動態地加載到存儲器並連接
目標文件格式:a.out COFF
(通常目標文件格式) PE
(可移植可執行) ELF
(可執行可連接)
7.4 可重定位目標文件
7.5 符號和符號表
全局符號
外部符號
本地符號
7.6 符號解析
7.6.1 連接器如何解析多重定義的全局符號
強符號:函數和已初始化的全局變量
弱符號:未初始化的全局變量
處理多重定義符號規則:1.不容許有多個強符號 2.一個強符號和多個弱符號,選擇強符號 3.多個弱符號,從弱符號中任意選擇一個
7.6.2 與靜態庫連接
靜態庫:編譯系統將全部相關目標文件打包成一個單獨文件,可用做連接器的輸入
靜態庫以一種稱爲存檔的特殊文件格式存放在磁盤中,存檔文件名由後綴.a標識
建立靜態庫:使用AR工具gcc -c XX.c ar rcs libXX.a
(靜態庫名)XX.o
(添加的程序)
使用靜態庫:編譯鏈接輸入文件和靜態庫gcc -O2 -c XX.c
(調用靜態庫程序名) gcc -static -o p2 XX.o
(調用靜態庫程序名) libXX.a
(靜態庫)
7.6.3 連接器如何使用靜態庫來解析引用
7.7 重定義
合併輸入模塊併爲每一個符號分配運行時的地址
重定義時兩步:重定位節和符號定義 重定位節中的符號引用
7.7.1 重定位條目
彙編器遇到對最終位置未知的目標引用
7.7.2 重定位符號引用
重定位符號引用
重定位絕對引用
7.8 可執行目標文件
7.9 加載可執行目標文件
7.10 動態連接共享庫
共享庫(共享目標):目標模塊,在運行時,能夠加載到任意的存儲地址,過程稱爲動態連接,由動態連接程序執行
共享庫的生成 gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享庫的使用:gcc -o main main.c -L. -lxxx
7.11 從應用程序中加載和連接共享庫
分發軟件
構建高性能的Web服務器
7.12 與位置無關的代碼(PIC)
編譯庫代碼:與位置無關的代碼,使用-fPIC選項指示GNU編譯系統生成PIC代碼
PIC數據引用
全局偏移量表
PIC函數調用
7.13 處理目標文件的工具
AR
:建立靜態庫,插入、刪除、列出和提取成員
STRINGS
:列出一個目標文件中全部可打印的字符串
STRIP
:從目標文件中刪除符號表信息
NM
:列出一個目標文件的符號表中定義符號
SIZE
:列出目標文件中節的名字和大小
READELF
:顯示一個目標文件的完整結構,包含SIZE和NM的功能
OBJDUMP
:全部二進制工具之母,顯示一個目標文件的全部信息,反彙編
LDD
:列出一個可執行文件在運行時所須要的共享庫
vim學習總結
vim啓動進入普通模式,處於插入模式或命令行模式時只須要按Esc或者Ctrl+[(這在vim課程環境中無論用)便可進入普通模式。普通模式中按i(插入)或a(附加)鍵均可以進入插入模式,普通模式中按:進入命令行模式。命令行模式中輸入wq回車後保存並退出vim。
命令行模式(Command line mode)
在命令行模式中能夠輸入會被解釋成並執行的文本。例如執行命令(:鍵),搜索(/和?鍵)或者過濾命令(!鍵)。在命令執行以後,Vim返回到命令行模式以前的模式,一般是普通模式。
在普通模式中,用的編輯器命令,好比移動光標,刪除文本等等。這也是Vim啓動後的默認模式。這正好和許多新用戶期待的操做方式相反(大多數編輯器默認模式爲插入模式)。
在這個模式中,大多數按鍵都會向文本緩衝中插入文本。大多數新用戶但願文本編輯器編輯過程當中一直保持這個模式。
使用vim命令進入vim界面
vim後面加上你要打開的已存在的文件名或者不存在(則做爲新建文件)的文件名。 打開Xfce終端,輸入如下命令
$ vim practice_1.txt
直接使用vim也能夠打開vim編輯器,可是不會打開任何文件。
$ vim
進入命令行模式後輸入:e 文件路徑 一樣能夠打開相應文件。
.遊標移動
在進入vim後,按下i鍵進入插入模式。在該模式下您能夠輸入文本信息,下面請輸入以下三行信息:
12345678 abcdefghijk shiyanlou.com
按Esc進入普通模式,在該模式下使用方向鍵或者h,j,k,l鍵能夠移動遊標。
按鍵 說明
h 左 l 右(小寫L) j 下 k 上 w 移動到下一個單詞 b 移動到上一個單詞
請嘗試在普通模式下使用方向鍵移動光標到shiyanlou這幾個字母上面。(附圖)
.進入插入模式
在普通模式下使用下面的鍵將進入插入模式,並能夠從相應的位置開始輸入
命令 說明
i 在當前光標處進行編輯 I 在行首插入 A 在行末插入 a 在光標後插入編輯 o 在當前行後插入一個新行 O 在當前行前插入一個新行 cw 替換從光標所在位置後到一個單詞結尾的字符(刪除從當前光標後到單詞結尾字母)
請嘗試不一樣的從普通模式進入插入模式的方法,在最後一行shiyanlou前面加上www.,注意每次要先回到普通模式才能切換成以不一樣的方式進入插入模式(附圖)
命令行模式下保存文檔
從普通模式輸入:進入命令行模式,輸入w回車,保存文檔。輸入:w 文件名能夠將文檔另存爲其餘文件名或存到其它路徑下
命令行模式下退出vim
從普通模式輸入:進入命令行模式,輸入wq回車,保存並退出編輯
如下爲其它幾種退出方式:
命令 說明
:q! 強制退出,不保存 :q 退出 :wq! 強制保存並退出 :w <文件路徑> 另存爲 :saveas 文件路徑 另存爲 :x 保存並退出 :wq 保存並退出
普通模式下退出vim
普通模式下輸入Shift+zz便可保存退出vim
刪除文本
普通模式下刪除vim文本信息
進入普通模式,使用下列命令能夠進行文本快速刪除:
命令 說明
x 刪除遊標所在的字符 X 刪除遊標所在前一個字符 Delete 同x dd 刪除整行 dw 刪除一個單詞(不適用中文) d$或D 刪除至行尾 d^ 刪除至行首 dG 刪除到文檔結尾處 d1G 刪至文檔首部 除此以外,你還能夠在命令以前加上數字,表示一次刪除多行,如: 2dd表示一次刪除2行
GDB 經常使用命令實戰
GDB 相關概念
GDB, 是 The GNU Project Debugger 的縮寫, 是 Linux 下功能全面的調試工具。GDB 支持斷點、單步執行、打印變量、觀察變量、查看寄存器、查看堆棧等調試手段。在 Linux 環境軟件開發中,GDB 是主要的調試工具,用來調試 C 和 C++ 程序。
若是要調試程序,須要在 gcc 編譯可執行程序時加上 -g 參數,首先咱們編譯 bugging.c 程序,生成可執行文件:
1.gcc -g -o bugging bugging.c -m32
其中-o
指定輸出文件名, -m32 表示構建32位可執行程序,實驗樓的環境是 64 位的 Ubuntu 14.04,因此默認會編譯爲 64 位的程序。
2.輸入 gdb bugging
進入 gdb 調試 bugging 程序的界面:
3.gdb bugging
在 gdb 命令行界面,輸入run 執行待調試程序:
4.(gdb) run
在 gdb 命令行界面,輸入quit 退出 gdb:
5.(gdb) quit
(附圖)
GDB 命令行界面使用技巧
命令補全
任什麼時候候均可以使用 TAB 進行補全,若是隻有一個待選選項則直接補全;不然會列出可選選項,繼續鍵入命令,同時結合 TAB 便可快速輸入命令。
部分 gdb 經常使用命令一覽表
命令 簡寫形式 說明
list l 查看源碼 backtrace bt、where 打印函數棧信息 next n 執行下一行 step s 一次執行一行,遇到函數會進入 finish 運行到函數結束 continue c 繼續運行 break b 設置斷點 info breakpoints 顯示斷點信息 delete d 刪除斷點 print p 打印表達式的值 run r 啓動程序 until u 執行到指定行 info i 顯示信息 help h 幫助信息
查詢用法
在 gdb 命令行界面,使用 (gdb) help command
能夠查看命令的用法。
執行 Shell 命令
在 gdb 命令行界面能夠執行外部的 Shell 命令:
(gdb) !shell
命令
例如查看當前目錄的文件:
`(gdb) !l