win32程式啟動過程

2021-09-30 05:09:33 字數 1329 閱讀 9706

在現代作業系統中,計算機應用程式以檔案形式(可執行檔案、動態庫檔案、配置檔案和其他檔案等)儲存在磁碟中。所謂「程式啟動過程」,指從使用者發出請求執行程式,到該應用程式完全啟動(例如程式介面完全顯示,準備響應使用者的輸入)這個過程。從系統分工的角度來看,程式啟動過程包括兩個階段:

(1)       作業系統負責把程式從磁碟讀入記憶體並且建立相應得執行環境

(2)       應用程式自身的初始化過程。

編譯連線過程:

1、 預編譯展開一些巨集

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

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

程式啟動過程:

1、 作業系統首先建立相應得程序並分配私有的程序空間,然後作業系統得載入器負責把可執行檔案的資料段和**段對映到程序的虛擬記憶體空間中

2、 載入器讀入可執行程式的匯入符號表,然後根據這些符號表可以查詢出該可執行程式所有依賴的動態鏈結庫

3、 載入器針對該程式依賴的每乙個動態鏈結庫呼叫loadlibrary

(1)    查詢對應得動態庫檔案,載入器為該動態鏈結庫確定乙個合適的基位址。如果該基位址和動態鏈結庫希望載入的基位址不同,載入器還要為該庫做rebase,然後把整個動態鏈結庫對映到虛擬記憶體空間中

(2)    載入器讀取該動態鏈結庫的匯入符號表和匯出符號表,比較應用程式要求的匯入符號是否匹配該庫的匯出符號

(3)    針對該庫的匯入符號表,查詢對應依賴的動態鏈結庫,如果有跳轉到第3步

(4)    呼叫該動態鏈結庫的初始化函式

直到所有應用程式直接/間接依賴的動態鏈結庫處理完畢,全部對映到應用程式程序空間,成為應用程式程序的一部分。

4、 初始化應用程式的全域性變數,對於全域性物件自動呼叫建構函式

5、 進入應用程式入口點函式開始執行

程式啟動效能定義為程式啟動所需要的時間,在工程實踐中,程式啟動效能有兩個指標需要分別對待,即冷啟動效能和熱啟動效能。冷啟動效能指作業系統重新啟動後,應用程式第一次啟動所需要的時間;熱啟動效能則指應用程式第2次及其以後啟動所需要的時間。之所以要區分這兩個指標,是因為作業系統的快取機制在發揮作用。程式第1次啟動完畢並且推出程式後,作業系統仍然會在記憶體的硬碟快取和系統快取中暫時保留可執行程式、相應的動態鏈結庫,以及程式用到的其他配置檔案/資源檔案的內容。從而在應用程式的第2次啟動時,可以減少大量的i/o操作,導致熱啟動效能要好於冷啟動效能。

Win32應用程式啟動步驟詳解

關於win32應用程式的啟動,我們給出乙個有可執行檔案 動態鏈結庫的例項來分析。作業系統建立程序,分配私有程序空間,理論上32作業系統每個程序有4g的記憶體空間,其中低2g為系統所用,高2g為程序所用。作業系統的載入器把可執行檔案的資料段和 段對映到程序的虛擬記憶體空間,需要注意的是並不是把所有的 ...

RT Thread stm32 啟動過程

以stm32f107為例 從鏈結指令碼 bsp stm32f107 stm32 rom.ld 中可以看到,程式的入口在reset handler 該函式位於bsp stm32f107 libraries cmsis devicesupport st stm32f10x start up gcc ri...

stm32啟動過程

三 總結 這三種模式請看下列圖示 三個不同作用的空間在微控制器裡面佔了三個空間,微控制器引導哪個空間資源啟動,由boot1和boot0決定!正常來說一般是從flash啟動!啟動的程式是在sram上執行!有乙個很關鍵資料結構的知識點,執行時sram會分成以下四個部分 常量區,堆,棧,靜態儲存區!例如 ...