第1章 計算機系統漫遊
- 計算機系統是由硬件和系統軟件組成的,它們共同工作來運行應用程序。
信息就是位 + 上下文
源程序實際上就是一個由0和1組成的位(bit)序列,8個位被組織成一組,稱爲字節(Byte)。
每個字節表示程序中某個文本字符。
大部分的現代系統都是用ASCII標準來表示文本字符,這種方式實際上就是用一個唯一的單字節大小的整數值來表示每個字符。
系統中所有的信息——包括磁盤文件、存儲器中的程序、存儲器中存放的用戶數據以及網絡上傳送的數據,都是由一串位表示的。
區分不同數據對象的唯一方法是我們讀到這些數據對象時的上下文。比如,在不同的上下文中,一個同樣的字節序列可能表示一個整數。
C編程語言的起源
- C語言與UNIX操作系統關係密切。
- C語言小而簡單。
- C語言是爲實踐目的設計的。
- C語言是系統級編程的首選,同時也非常適用於應用級程序的編寫。
- 缺點:指針是造成困惑和程序錯誤的一個常見原因;C語言缺乏對非常有用的抽象的顯式支持。
程序被其他程序翻譯成不同的格式
- 目標程序也成爲可執行目標文件。
- hello.c–hello.i–hello.s–hello.o–hello
- 編譯系統: 預處理器、編譯器、彙編器和鏈接器。
- 預處理階段: #號,修改原始C程序。
- 編譯階段: 得到彙編語言程序。
- 彙編階段:得到機器語言指令,可重定位目標程序。
- 鏈接階段:合併,可執行目標文件。
- GNU項目–GNU是GNU’s Not Unix的縮寫。
爲什麼要了解編譯系統如何工作
- 優化程序性能
- 理解鏈接時出現的錯誤
- 避免安全漏洞
處理器讀取並解釋存儲在存儲器中的指令
系統的硬件組成
- 總線
- 總線是貫穿整個系統的一組電子管道。
- 通常總線被設計成傳送定長的字節塊,也就是字(word)。
- 字中的字節數(即字長)是一個基本的系統參數,在各個系統中不盡相同。現在的大多數機器字長有的是4個字節(32位),有的是8個字節(64位)。
- I/O設備
- 輸入/輸出(I/O)設備是系統與外部世界的聯繫通道。
- 常見I/O設備:鍵盤、鼠標、顯示器、磁盤驅動器(簡稱磁盤)。
- 每個I/O設備通過一個控制器或適配器與I/O總線相連。
- 控制器和適配器之間的區別在於它們的封裝方式。
- 控制器是置於I/O設備本身的或者系統的主印製電路板(簡稱主板)上的芯片組;
- 而適配器則是一塊插在主板插槽上的卡。
- 主存
- 主存是一個臨時存儲設備,在處理器執行程序時,用來放程序和程序處理的數據。
- DRAM,動態隨機存取儲存器。
- 從物理上來說,主存是由一組DRAM芯片組成的。
- 從邏輯上來說,存儲器是一個線性的字節數據,每個字節都有唯一的地址(即數組索引),這些地址是從零開始的。
- 處理器
- 中央處理單元,CPU。
- CPU簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎。
- 處理器的核心是一個字長的存儲設備(或寄存器),稱爲程序計數器(PC)。
- 在任何時刻,PC都指向主存中的某條機器語言指令(即含有該條指令的地址)。
- 從系統通電開始,直到系統斷電,處理器一直在不斷地執行PC指向的指令,再更新PC,使其指向下一條指令。
- 處理器看上去是按照一個非常簡單的指令執行模型來操作的,這個模型是由指令集結構決定的。
- 處理器從程序計數器指向的存儲器處讀取指令,解釋指令中的位,執行該指令指示的簡單操作,然後更新PC,使其指向下一條指令,而這條指令並不一定與存儲器中剛剛執行的指令相鄰。
- 操作是圍繞着主存、寄存器文件(register file)和算術/邏輯單元(ALU)進行的。
- 寄存器文件是一個小的存儲設備,由一些1字長的寄存器組成,每個寄存器都有唯一的名字。
- ALU計算新的數據和地址值。
- CPU在指令的要求下可能會執行以下操作:
- 加載:把一個字節或者一個字從主存複製到寄存器。
- 存儲:把一個自己或者一個字從寄存器複製到主存的某個位置。
- 操作:把2個寄存器的內容複製到ALU,ALU對這兩個字做算術操作,並將結果存放到一個寄存器中。
- 跳轉:從指令本身中抽取一個字,並將這個字複製到PC中。
- 指令集結果:描述每條機器代碼指令的效果;
- 微體系結構:描述處理器實際上是如何實現的。