程式編譯過程與軟體啟動過程

2021-08-31 05:07:14 字數 2407 閱讀 4466

一、

軟體執行流程

1、軟體編譯流程

預編譯完成巨集展開工作。øø

編譯器合成這些目標檔案成乙個庫檔案(.lib),同時解析可以找到的符號引用。此時這個庫檔案包含了二進位制的**段和資料段,同樣也會包含乙個符號表,因為有一些符號需要引用其他靜態/動態鏈結庫的匯出符號。

ø鏈結器負責把目標的庫檔案和所有需要引用的靜態/動態鏈結庫進行鏈結,即需要首先把靜態庫合成到可執行檔案中。轉換相應的符號引用為位址,然後確保所引用的其他動態鏈結庫的符號存在。最後生成可執行檔案,可執行檔案的符號表只需要記錄匯入符號表。

2、軟體執行流程

就是乙個shell

鏈結,shell

負責管理乙個叫"

名字空間"

的類似檔案系統似的「超檔案系統」,

它允許應用程式在任何地方在不知訪問物件名字和位置的前提下訪問到這個物件,此類物件有:檔案,目錄,驅動器,印表機以及網路資源。而名字空間就是shell

把這些物件有層次組織起來的乙個結構。名字空間為使用者和應用程式提供了一種可靠和高效的方法來訪問和管理物件。 ø

在32位x86系統上:

從0x00000000到0x7fffffff的空間中存放著 應用程式**,全域性變數,每個執行緒堆疊,dll**。

從0x80000000到0xc0000000的空間中存放著核心和執行體,hal(硬體抽象層),引導驅動程式。

從0xc0000000到0xc0800000的空間中存放著程序頁表和超空間。

從0xc0800000到0xffffffff的空間中存放著系統快取記憶體,分頁緩衝池,非分頁緩衝池。

øcreateprocess開啟應用程式檔案(.exe),它先掃瞄該檔案的檔案頭,該檔案頭里含有檔案能執行在那個環境之下,如果是win32環境,系統就直接載入檔案的**和資料並輸入(import)該檔案執行所需的dll函式。如果不是win32環境比如是os/2的.exe則先載入相應的環境子系統,再由該環境載入該檔案的**和資料以及該檔案執行所需的dll函式。

載入器負責把可執行檔案的資料段和**段對映到程序的虛擬記憶體空間中,讀入可執行程式的匯入符號表,然後根據這些符號表可以查詢出該可執行程式所有依賴的動態鏈結庫。

ø程序載入**和資料完畢後,就開始建立執行緒來執行程序空間內的**。程序是靜態的,它只是執行緒的容器。乙個程序至少因該有乙個執行緒(main thread),其它執行緒都是主線程通過呼叫createthread函式建立的。執行緒也是核心物件,他的實際建立者是ntcreatethread系統服務函式。乙個執行緒只是乙個執行緒核心物件和兩個堆疊(乙個核心堆疊,用於執行緒執行在核心態;乙個使用者堆疊,用於執行緒執行在使用者態),執行緒與程序類似,也擁有執行緒核心物件計數和執行緒控制代碼。執行緒用於描述程序中的執行路徑。

ø每當程序被初始化時,系統就要建立乙個主線程。該執行緒與c/c++執行時庫的啟動**一道開始執行,啟動**則呼叫進入點函式(就是main函式,它也是主線程的進入點函式),並且繼續執行直到進入點函式返回並且c/c++執行時庫的啟動**呼叫exitprocess為止。每個執行緒都有自己的入口點函式,主線程入口點函式名字必須是main,wmain,winmain或wwinmain.而其他的執行緒入口點函式名字可使用任何名字。每個執行緒函式必須有乙個返回值,它將作為執行緒的退出**。對於主線程來說,這個返回值將傳給c/c++執行時庫的啟動函式。c/c++執行時庫的啟動函式是乙個程式呼叫的第乙個函式,它是在程式鏈結時由鏈結程式選擇相應的啟動函式並加到程式的開始處。c/c++執行時庫有四個版本的啟動函式,他們分別對應不同型別的應用程式。比如,需要ansi字元和字串的gui應用程式的啟動函式是winmaincrtstartup,其對應的進入點函式是winmain,需要unicode字元和字串的gui應用程式的啟動函式是wwinmaincrtstartup,其對應的進入點函式是wwinmain,而需要ansi字元和字串的cui應用程式(如控制台console程式)的應用程式的啟動函式是maincrtstartup,對應的入口點函式為main;需要unicode字元和字串的cui應用程式(如控制台console程式)的應用程式的啟動函式為wmaincrtstartup,對應的入口點函式為wmain。c/c++執行時庫的啟動函式(以winmaincrtstartup為例)的功能如下

:檢索指向新程序的完整命令列指標;檢索指向新程序的環境變數的指標;對c/c++執行時的全域性變數進行初始化;對c執行期的記憶體單元分配函式(比如malloc,calloc)和其他低層i/o例程使用的記憶體棧進行初始化。為c++的全域性和靜態類呼叫建構函式。 ø

啟動函式條用主函式,進入應用程式的執行。

ø當主函式執行完畢返回時,啟動函式就呼叫c

執行期的exit()

函式,將返回值(nmainretval)

傳遞給啟動函式。之後exit()

便開始收尾工作。 ø

執行時啟動函式呼叫作業系統的exitprocess

函式,將nmainretval

傳遞給它,這使得作業系統能夠撤銷程序並設定它的exit

**。

Cocoa程式啟動過程

詳談cocoa程式啟動過程是本文要介紹的內容,首先,我們的程式執行的時候是物件之間的相互作用,而不是類之間的作用。新建乙個helloword的cocoa程式,可以在xib中找到下面幾個物件 file s owner xib檔案的載入者 firsrt responder 訊息鏈中第乙個能響應相應訊息的...

iOS 程式啟動過程

1.main函式 程式啟動後 首先執行main函式,3.delegate 物件開始處理 監聽 系統事件 沒有storyboard uiwindow 繼承子uiview ios 程式啟動後建立的 第乙個可視控制項就是uiwindow,乙個程式之所以能顯示在螢幕上 是因為 它有window 想要是 wi...

mysql啟動過程長 mysql啟動過程

mysql啟動過程經過以下順序 1.mysql讀取配置檔案的順序 讀取順序 etc my.cnf etc mysql my.cnf usr etc my.cnf my.cnf 2.mysql啟動方式 mysql啟動方式有三種 mysqld mysqld safe mysqld multi 主要用於多...