1.1 Information Is Bits + Context
每個源程序是有一連串二進制值組成,在不同的Context中,這個二進制序列多代表的意義不同。
C 語言好處:
1. C與Unix操作系統更緊密
2. C 是更小更簡單的語言
3. C 有實用目的
但是C缺乏有用的支持(類,對象,異常)
1.2 Programs Are Translated byOther Programs into Different Forms
一個高級C程序需要被其他程序轉換成低級的機器語言序列,稱之爲可執行對象程序並以二進制存儲。在Unix 系統中,可運行此命令:gcc -o hello hello.c
GCC 編譯器執行的四個階段:
1. Preprocessing phase. Thepreprocessor(cpp) 根據#character修改源文件
。例如,#include<stdio.h>在第一行,把文件stdio.h直接插入到源文件。後綴名 .i。
2. Compilation phase。The compiler(ccl) (assembly-language program)把文件 .i 翻譯成 .s 文件。 Assembly-languageprogram 能夠把每個語句轉換成低級的機器指令(即使不同的高級語言最後可被轉換成相同的低級語言)。
3. Assembly phase。The assembler(as) 把 .s 翻譯成機器語言並打包成可定位的對象程序 .o(binary file).
4. Linking phase. The linker(ld) 把需要的 .o 文件鏈接起來並生成可執行文件。
GCC 是 GNU(short for GNU’s not unix)開發的。The GNU 環境包括EMACS editor, GCC compiler,GDB debugger, assembler, linker。
1.3 彙編系統如何工作
爲什麼要理解彙編系統如何工作?
優化項目性能。
理解鏈接時錯誤。大部分複雜項目錯誤是由於鏈接器操作。
避免安全漏洞。大部分是由於buffer溢出。
1.4 處理器讀並理解存儲在內存中的指令
Shell 是一個命令行解釋器,它不斷地等待命令行的輸入並執行輸入的命令。如果輸入的命令與內嵌的shell命令不一致,它假定這是一個可執行文件,然後加載並執行。
1.4.1 系統的硬件組織
Buses:是一個電子管道的收集者。在各個組件之間進行數據的傳輸,一般一次傳輸一個字(大部分系統爲4Bytes)
I/O Devices: I/O用於連接外部世界的連接器。每個I/O設備通過連接器或者適配器跟I/Obus連接。連接器是一個嵌入到主板的芯片,適配器是一個可插入主板上的卡。
內存: 當處理器運行時,內存臨時存儲正在運行的程序和所需的數據。它由動態隨機存儲芯片組成。不同的機器,對應的數據項大小可能不同。例如IA32,short數據類型需要2個字節,int,float,long數據類型需要4個字節,double數據類型需要8個字節。
處理器:它是一個執行存儲在內存程序的引擎,在處理器中最主要的PC,在任何時候,PC都指向正在運行指令的下一條指令的地址。處理器根據指令集對指令進行操作,每個指令都涉及多個步驟。寄存器文件是一個小的存儲設備(由字大小的寄存器組成並且有唯一的名字)。
CPU執行一個指令的簡單操作:
1、 Load:從內存copy一個字節或者字到寄存器。
2、 Store:從寄存器copy一個字節或者字到內存。
3、 Operate:從兩個寄存器中copy兩個內容到ALU,計算之後結果存儲到其中一個寄存器。
4、 Jump:從指令本身取出一個字並copy到PC中。
1.4.2 運行的hello程序
最初,shell程序已經開始執行並等待輸入命令,當在命令行輸入“./hello”之後,shell把這些字符存儲到寄存器和內存中,當按“enter”鍵之後(shell將知道已完成輸入),shell將把存儲在硬盤上的可執行文件(代碼和數據)加載到內存(使用DMA技術直接從硬盤加載到內存而不需要經過處理器)。一旦代碼和數據加載完成,處理器則從main開始執行機器語言指令。
1.5 高速緩存至關重要
1.6 存儲設備的層次結構
1.7 操作系統管理硬件
基本功能:1. 防止硬件被濫用 2. 嚮應用程序提供簡單一致的機制來控制複雜而又通常大相徑庭的低級硬件設備。
1.7.1 進程
它是操作系統對一個正在運行的程序的一種抽象。(併發機制:上下文切換)
1.7.2 線程
一個進程可有多個線程執行單元組成,每個線程都運行在進程的上下文中。
1.7.3 虛擬存儲器(每個進程看到的是一致的存儲器,稱爲虛擬地址空間)
1. 程序代碼和數據
2. 堆
3. 共享庫
4. 棧
5. 內核虛擬存儲器
1.7.4 文件
文件就是字節序列,每個I/O設備都可視爲文件。系統中的輸入輸出都是通過UNIX I/O的系統函數調用讀寫文件來實現的。
1.8 系統之間利用網絡通信
一個熟悉的telnet應用在一個遠程主機上運行hello程序。
1.9 重要主題
1.9.1 併發和並行
併發是一個通用概念,指一個同時具有多個活動的系統。
並行指的是用併發使一個系統運行的更快。
1. 線程級併發
2.指令級並行
3. 單指令、多數據並行
1.9.2 計算機系統中抽象的重要性
文件是對I/O的抽象
虛擬存儲器是對程序存儲器的抽象
進程是對一個正在運行的程序的抽象
虛擬機是對整個計算機的抽象