1、編譯
編譯過程又可以被分為兩個階段:編譯、匯編。
編譯是指編譯器讀取字符流的源程序,對其進行詞法與語法的分析,將高級語言指令轉換為功能等效的匯編代碼。
匯編器是將匯編代碼轉變成機器可以執行的命令,每壹個匯編語句幾乎都對應壹條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表壹壹翻譯即可。
2、鏈接
鏈接的主要內容是將各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。鏈接又分為靜態鏈接和動態鏈接:
靜態鏈接是指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行文件會比較大;
動態鏈接則是指鏈接階段僅僅只加入壹些描述信息,而程序執行時再從系統中把相應動態庫加載到內存中去。
3、裝載
程序在經過鏈接後,得到了可執行文件,下壹步就需要將可執行程序加載到內存中。
由於現代操作系統均采用分頁的方式來管理內存,所以操作系統只需要讀取可執行文件的文件頭,之後建立起可執行文件到虛擬內存的映射關系,而不需要真正的將程序載入內存。
4、運行
加載器將可執行目標文件中的代碼和數據從磁盤復制到內存中,然後通過跳轉到程序的第壹條指令或入口點來運行程序。
在程序的運行過程中,CPU發現有些內存頁在物理內存中並不存在並因此觸發缺頁異常,此時CPU將控制權限轉交給操作系統的異常處理函數,操作系統負責將此內存頁的數據從磁盤上讀取到物理內存中。