為了使計算機程式得以執行,計算機需要載入程式碼,同時也要載入資料,然後由處理器執行指令。整個過程可以總結為編譯、連結、裝載、執行。
1、編譯編譯過程又可以被分為兩個階段:編譯、彙編。編譯是指編譯器讀取字元流的源程式,對其進行詞法與語法的分析,將高階語言指令轉換為功能等效的彙編程式碼。 彙編器是將彙編程式碼轉變成機器可以執行的命令,每一個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可。
2、連結連結的主要內容是將各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確地銜接。連結又分為靜態連結和動態連結:靜態連結是指在編譯階段直接把靜態庫加入到可執行檔案中去,這樣可執行檔案會比較大;動態連結則是指連結階段僅僅只加入一些描述資訊,而程式執行時再從系統中把相應動態庫載入到記憶體中去。
3、裝載程式在經過連結後,得到了可執行檔案,下一步就需要將可執行程式載入到記憶體中。由於現代作業系統均採用分頁的方式來管理記憶體,所以作業系統只需要讀取可執行檔案的檔案頭,之後建立起可執行檔案到虛擬記憶體的對映關係,而不需要真正的將程式載入記憶體。
4、執行載入器將可執行目標檔案中的程式碼和資料從磁碟複製到記憶體中,然後透過跳轉到程式的第一條指令或入口點來執行程式。在程式的執行過程中,CPU發現有些記憶體頁在物理記憶體中並不存在並因此觸發缺頁異常,此時CPU將控制權限轉交給作業系統的異常處理函式,作業系統負責將此記憶體頁的資料從磁碟上讀取到物理記憶體中。資料讀取完畢之後,作業系統讓CPU jmp到觸發了缺頁異常的那條指令處繼續執行,此時指令執行就不會再有缺頁異常了。擴充套件資料為使計算機按預定要求工作,首先要編制程式,無論是最早的作業系統還是現代作業系統,程式的執行都是計算機工作的本質。早期計算機是單任務執行,由程式設計師直接編寫作業系統可以識別的機器語言,到現在可以實現多道程式並行,並且程式的開發由更利於程式設計師理解的高階語言編寫,源程式在經過一系列翻譯過程,變成計算機理解的機器語言,再執行。整個程式執行的過程,需要CPU、記憶體、程式程式碼、裝置等配合,才能實現程式要表達的功能。
為了使計算機程式得以執行,計算機需要載入程式碼,同時也要載入資料,然後由處理器執行指令。整個過程可以總結為編譯、連結、裝載、執行。
1、編譯編譯過程又可以被分為兩個階段:編譯、彙編。編譯是指編譯器讀取字元流的源程式,對其進行詞法與語法的分析,將高階語言指令轉換為功能等效的彙編程式碼。 彙編器是將彙編程式碼轉變成機器可以執行的命令,每一個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可。
2、連結連結的主要內容是將各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確地銜接。連結又分為靜態連結和動態連結:靜態連結是指在編譯階段直接把靜態庫加入到可執行檔案中去,這樣可執行檔案會比較大;動態連結則是指連結階段僅僅只加入一些描述資訊,而程式執行時再從系統中把相應動態庫載入到記憶體中去。
3、裝載程式在經過連結後,得到了可執行檔案,下一步就需要將可執行程式載入到記憶體中。由於現代作業系統均採用分頁的方式來管理記憶體,所以作業系統只需要讀取可執行檔案的檔案頭,之後建立起可執行檔案到虛擬記憶體的對映關係,而不需要真正的將程式載入記憶體。
4、執行載入器將可執行目標檔案中的程式碼和資料從磁碟複製到記憶體中,然後透過跳轉到程式的第一條指令或入口點來執行程式。在程式的執行過程中,CPU發現有些記憶體頁在物理記憶體中並不存在並因此觸發缺頁異常,此時CPU將控制權限轉交給作業系統的異常處理函式,作業系統負責將此記憶體頁的資料從磁碟上讀取到物理記憶體中。資料讀取完畢之後,作業系統讓CPU jmp到觸發了缺頁異常的那條指令處繼續執行,此時指令執行就不會再有缺頁異常了。擴充套件資料為使計算機按預定要求工作,首先要編制程式,無論是最早的作業系統還是現代作業系統,程式的執行都是計算機工作的本質。早期計算機是單任務執行,由程式設計師直接編寫作業系統可以識別的機器語言,到現在可以實現多道程式並行,並且程式的開發由更利於程式設計師理解的高階語言編寫,源程式在經過一系列翻譯過程,變成計算機理解的機器語言,再執行。整個程式執行的過程,需要CPU、記憶體、程式程式碼、裝置等配合,才能實現程式要表達的功能。