深入理解計算機系統 計算機系統漫遊

2022-05-12 06:18:31 字數 1722 閱讀 6400

這裡以最簡單的例子 helloworld 為例,新建乙個 hello.c 的原始檔,新增如下**

#include "stdio.h"

int main()

使用 gcc -o hello.c hello 指令可以將原始檔轉換為可執行程式,-o 選項可以指定可執行程式的名稱,不指定該選項時預設為輸出乙個 a.out 的可執行程式。

在執行上述指令的過程中,gcc 讀取目標原始檔,並將其翻譯成可執行檔案,期間可分為四個階段:

(1). 預處理階段

程式根據 # 開頭的指令,修改原始的 c 程式,如 #include "stdio.h" ,這裡告訴預處理器讀取對應系統標頭檔案 stdio.h 的內容,並直接插入到程式文字中,得到乙個 .i 為字尾的檔案,可以通過

gcc -e hello.c 得到該檔案,但此時只會獲得該預處理後檔案的輸出,如果想要儲存該檔案則需使用 gcc -e hello.c -o hello.i  。

(2). 編譯階段

程式會將 hello.i 檔案翻譯成 hello.s 檔案,其包含乙個組合語言程式。可以通過 gcc -s hello.c 來輸出該彙編檔案。

(3). 彙編階段

接下來將 hello.s 翻譯成機器語言指令,把這些指令打包成乙個叫做可重定位目標程式的格式,並將結果儲存在乙個叫做 hello.o 的檔案中,這是乙個二進位制檔案,是 hello.s 的指令編碼。可以通過 gcc -c hello.c 來生成 hello.o 檔案。

(4). 鏈結階段

在 hello.c 檔案中,可以看到其呼叫了 printf 函式,其存在於標準 c 庫中,printf 函式存在於乙個名為 printf.o 的單獨預編譯好了的目標檔案中,而我們呼叫了這個函式,因此需要將其合入到我們的 hello 程式中,鏈結器就負責處理這種合併,將所有 .o 檔案合併結果得到乙個 hello 程式,可以被載入到記憶體當中被系統執行。

(1). 匯流排

匯流排貫穿了整個系統,是一組電子管道,主要負責資訊的傳輸,通常匯流排設計為傳送定長的位元組塊,即字,字的位元組數(也叫字長)是乙個基本的系統引數,不同系統不盡相同,目前大多數機器字長多為 4 個位元組(32位)或 8 個位元組(64位)。

(2). i/o 裝置

i/o 裝置是系統與外部連線的通道,這裡常用的 i/o 裝置主要有鍵盤滑鼠,顯示器,磁碟等。每個 i/o 裝置都通過乙個 控制器 或者 介面卡 與 i/o 匯流排相連線。控制器和介面卡的區別主要在於封裝方式上的不同,控制器通常為 i/o 裝置本身或者系統的主機板上的晶元組,而介面卡通常為一塊插在主機板插槽上的卡,但其功能基本上是一致的,即為 i/o 匯流排和 i/o 裝置之間傳遞資訊。

以上為乙個典型系統的硬體組成。

(3). 主存

主存是乙個臨時儲存裝置,即我們常說的記憶體,主要用來存放程式和程式相關的資料,從物理的層面來說,主存是一組動態隨機儲存器(dram)晶元組成,從邏輯上說,主存是乙個線性的位元組陣列,每個位元組都有其索引(位址),位址從零開始。

(4). 處理器

**處理單元(cpu),簡稱處理器,是解釋(或執行)儲存在主存中指令的引擎,處理器的核心是乙個大小為乙個位元組的儲存裝置(或暫存器),稱為程式計數器(pc),在任何時刻,pc 都指向主存中的一條機器指令。從系統通電開始到斷電,處理器一直在不斷執行程式計數器指向的指令,並且不斷更新該程式計數器,使用指向下一條指令。處理器從程式計數器指向的記憶體處讀取指令,解釋該指令,執行指令的操作,然後更新程式計數器,使其指向下一條指令,而下條指令未必與本次執行的指令相鄰(位址上),如函式呼叫。

深入理解計算機系統 計算機系統漫遊

第一章 計算機系統漫遊 計算機系統是由硬體和系統軟體組成的。所有計算機系統都是由相似的硬體和軟體組成,它們又執行著相似的功能。以hello程式為例。1.1資訊就是位 上下文 hello程式的生命是從源程式 原始檔 開始的。源程式是程式設計師編寫的,hello.c。源程式是 0和1 的位元位,8個一組...

深入理解計算機系統 計算機系統漫遊

1 程式編譯階段 以hello world 程式為例,介紹計算機系統的基本組成結構和程式的編譯過程。include int main 該程式的執行經歷這樣乙個過程 源程式首先經預處理器處理 將 include中的內容插入到源程式中,得到另乙個程式hello.i 編譯階段 hello.i程式經過編譯,...

1 深入理解計算機系統 計算機系統漫遊

1.資訊就是 位 上下文 由 ascii字元 乙個唯一的單位元組大小的整數值來表示每個字元 構成的檔案叫文字檔案,其他所有的檔案叫二進位制檔案 2.程式被其他程式翻譯成不同格式 gcc o hello hello.c 每條 c 語句必須被其他程式轉化為一些列的低階機器語言指令。然後這些指令按照一種稱...