1 預處理
預編譯過程主要處理那些原始檔中的以「#」開始的預編譯指令,主要處理規則有:
將所有的「#define」刪除,並展開所用的巨集定義
處理所有條件預編譯指令,比如「#if」、「#ifdef」、 「#elif」、「#endif」
處理「#include」預編譯指令,將被包含的檔案插入到該編譯指令的位置,注:此過程是遞迴進行的
刪除所有注釋
新增行號和檔名標識,以便於編譯時編譯器產生除錯用的行號資訊以及用於編譯時產生編譯錯誤或警告時可顯示行號
保留所有的#pragma編譯器指令。
2 編譯
編譯過程就是把預處理完的檔案進行一系列的詞法分析、語法分析、語義分析及優化後生成相應的彙編**檔案。這個過程是整個程式構建的核心部分。
3 彙編
彙編器是將彙編**轉化成機器可以執行的指令,每一條彙編語句幾乎都是一條機器指令。經過編譯、鏈結、彙編輸出的檔案成為目標檔案(object file)
4 鏈結
鏈結的主要內容就是把各個模組之間相互引用的部分處理好,使各個模組可以正確的拼接。 鏈結的主要過程包塊 位址和空間的分配(address and storage allocation)、符號決議(symbol resolution)和重定位(relocation)等步驟。
5 靜態鏈結和動態鏈結
動態鏈結方法:使用這種方式的程式並不在一開始就完成動態鏈結,而是直到真正呼叫動態庫**時,引導程式才計算(被呼叫的那部分)動態**的邏輯位址,然後等到某個時候,程式又需要呼叫另外某塊動態**時,引導程式又去計算這部分**的邏輯位址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態鏈結的程式
6 虛擬記憶體技術
虛擬儲存器是指具有請求調入功能和置換功能,能從邏輯上對記憶體容量加以擴充的一種儲存系統.
7 分頁和分段
分頁: 使用者程式的位址空間被劃分成若干固定大小的區域,稱為「頁」,相應地,記憶體空間分成若干個物理塊,頁和塊的大小相等。可將使用者程式的任一頁放在記憶體的任一塊中,實現了離散分配。
分段: 將使用者程式位址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊。儲存分配時,以段為單位,段與段在記憶體中可以不相鄰接,也實現了離散分配。
分頁與分段的主要區別
頁是資訊的物理單位,分頁是為了實現非連續分配,以便解決記憶體碎片問題,或者說分頁是由於系統管理的需要.段是資訊的邏輯單位,它含有一組意義相對完整的資訊,分段的目的是為了更好地實現共享,滿足使用者的需要.
頁的大小固定,由系統確定,將邏輯位址劃分為頁號和頁內位址是由機器硬體實現的.而段的長度卻不固定,決定於使用者所編寫的程式,通常由編譯程式在對源程式進行編譯時根據資訊的性質來劃分.
分頁的作業位址空間是一維的.分段的位址空間是二維的.
8 頁面置換演算法
最佳置換演算法opt:不可能實現
先進先出fifo
最近最久未使用演算法lru:最近一段時間裡最久沒有使用過的頁面予以置換.
clock演算法
9 邊沿觸發和水平觸發
邊緣觸發是指每當狀態變化時發生乙個 io 事件,條件觸發是只要滿足條件就發生乙個 io 事件
程式編譯鏈結
認識各種儲存部件 暫存器 記憶體 磁碟 暫存器 快取記憶體 記憶體 磁碟快取 磁碟 主存 儲存程序執行時的程式和資料 暫存器 速度最快,昂貴容量不大,一般以字為單位,只要存放指令一次操作的資料就夠了 儲存部件的層次 快取記憶體 一種速度比記憶體快的儲存裝置,一般同暫存器一樣整合在cpu中。存放記憶體...
靜態程式編譯鏈結與裝載
linkers and loaders 中文版 英文版 elf檔案格式 c語言編譯過程詳解,預處理,編譯,彙編,鏈結 乾貨滿滿 靜態程式編譯鏈結與裝載 一 問題的引入以及工具介紹 靜態程式編譯鏈結與裝載 二 編譯鏈結以及elf中section詳細分析 靜態程式編譯鏈結與裝載 三 segment分析以...
編譯與鏈結
首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.假如你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯單元裡面,但兩個以上就可以分...