計算機系統由硬體和系統軟體構成,乙個程式的執行離不開軟硬體的協作。先來簡要的介紹一下計算機系統的硬體組成。雖然一些高階程式語言編寫的程式與硬體無關,但程式終究是要控制硬體來執行,所有的高階語言源程式都會被編譯為機器指令而後由硬體來執行,。
1、cpu:cpu是**處理單元的簡稱。它負責解釋執行儲存在主儲存器中的指令。cpu的核心部分為算術邏輯單元alu、程式計數器pc和一些暫存器。其中,pc本身是乙個字長的儲存裝置,它時時刻刻的只想主存中的某條機器語言指令。從系統上電以後,處理器從程式計數器pc指向的儲存器讀取指令,解釋指令中的位,然後更新pc,使其指向下一條指令,具體的順序由指令集結構所決定。
2、匯流排:匯流排實際上就是一組電子管道,它負責計算機系統各部件之間位元組資訊的傳遞。通常匯流排傳輸一些定長的位元組塊,這個定長的位元組塊也就是字(word)的概念。乙個字包含的位元組數即為這個系統的字長。我們說32位的計算機的字長為4個位元組,64位的計算機字長為8.
3、主儲存器:主儲存器是乙個易失性儲存區,也就是常說的ram,它是乙個程式和資料的暫存場所。從邏輯上來說,儲存器是乙個線性的位元組陣列,每個位元組都有其唯一的索引(也就是位址的概念)。一般不同的機器指令都有不同的位元組長度。
4、i/o裝置:i/o裝置是計算機系統與外界通訊的渠道。上圖所示的usb、顯示器、磁碟和鍵盤滑鼠等都是i/o裝置。i/o裝置通常由機械部件和電子部件兩部分組成,其中,電子部件又稱為裝置控制器或介面卡。每乙個i/o裝置都是通過乙個控制器與i/o匯流排連線。i/o裝置又分為塊裝置和字元裝置兩種。上述中磁碟、usb等就是常見的塊裝置,而鍵盤滑鼠和網路介面為字元裝置。
資訊實際上是由位序列以及位序列所處的上下文來決定的。使用二進位制在於二值訊號能夠更容易的表示、儲存和壓縮。
以乙個源程式hello.c為例,
#include int main()
通常來說,英文本母使用ascii編碼就足以完全表示。也就是說,源程式實際是由0和1組成的位序列,8個位組成乙個位元組。實際上乙個源程式檔案是以位元組序列的形式存在的。計算機上處理的一切資料資訊,包括磁碟檔案、網路檔案以及儲存器中的程式等等都是由一連串的位序列構成。區分不同的資料物件的方法就是我們讀到這些資料物件時的上下文。
同樣以乙個c語言的源程式hello,c為例子,**的執行經歷了以下幾個階段。
1、預處理階段:預處理器 根據預編譯指令#的標記,修改原始的c程式檔案,讀取系統標頭檔案然後直接插入到源程式之中。
2、編譯階段:編譯器 將經過預處理階段的程式編譯為匯程式設計序。我們知道彙編指令實際上是機器指令的可讀形式,同時,作為所有程式編譯後的中間態,組合語言是高階語言編譯後的通用語言。
3、彙編階段:接著,彙編器 將組合語言程式翻譯為機器語言指令,並將這些指令打包生成可重定位目標程式,然後輸出hello,o檔案,它是乙個二進位制檔案,即使用機器語言指令編碼的位元組序列。
4、鏈結階段:在源程式中呼叫了c庫函式的輸出函式printf函式,而printf函式存在於乙個名為printf.o的單獨的預編譯好的目標檔案中,聯結器 通過鏈結的方式將它合併到我們的hello.o程式中。
具體的執行過程為:shell下,鍵盤輸入./hello.o,shell將字元讀入暫存器中,然後再讀入儲存器中。然後回車鍵確定,shell執行一系列指令載入hello檔案,將目標檔案中的程式和資料由磁碟複製到主存,然後cpu通過程式計數器的指示執行hello程式,輸出helloworld字元到顯示器。
《深入理解計算機系統》學習筆記(一)
第1章計算機系統漫遊 1.1 位 bit 位元組 8位 二進位制檔案 其他檔案 1.2 hello.c hello.i 修改文字,例如將標頭檔案內容插入 hello.s 匯程式設計序 hello.o 可重定位目標程式 二進位制 printf.o hello 可執行目標程式 二進位制 gun gun ...
深入理解計算機系統學習筆記(一)
為了說明程式的編譯過程,我們用經典的hello world程式作為例子 include int main int argc,char const argv 在linux系統中,我們用gcc編譯器將源程式檔案helloworld.c編譯成可執行目標檔案helloworld。zengwh zengwh ...
深入理解計算機系統 筆記
cu control unit cpu暫存器,晶元的快取記憶體sram 晶元外的快取記憶體sram 主存dram 本地硬碟 網路分布式檔案系統。拷貝次數越少,越好,netty,零拷貝 dma控制器與cpu分時使用記憶體的三種方式 程序 作業系統對執行程式的一種抽象,乙個系統上,多個程序都好像獨佔硬體...