資源描述:
《一個(gè)microsoft的_exe程序的啟動(dòng)過程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、一個(gè)microsoft的.exe程序的啟動(dòng)過程???學(xué)習(xí)windows?編程從mfc角度來說可分為兩部分那就是WinMain函數(shù)以前的,和WinMain函數(shù)以后的。前者涉及很多windows操作系統(tǒng)內(nèi)部的知識(shí),后者么看mfc源碼就可以了。雖然大多數(shù)程序不需要你了解太多關(guān)于os加載應(yīng)用程序這方面的知識(shí),但我認(rèn)為能較深入了解windows?os的運(yùn)行情況對(duì)程序員是很有幫助的。???最近我正在研究一個(gè)microsoft的.exe程序的啟動(dòng)過程,這也是以上所說的關(guān)于os如何加載程序的知識(shí),它包括進(jìn)程創(chuàng)建,主線程創(chuàng)建,PE文
2、件加載,程序c運(yùn)行時(shí)啟動(dòng)函數(shù)以及四種main函數(shù)的調(diào)用等許多令我不得不靜下心來好好思索的東東。從mfc編程角度來說,這些都是不得見的,不過了解這些對(duì)程序員編制好的windows程序是有好處的。在平時(shí)的學(xué)習(xí)中我有很多疑點(diǎn),到底在桌面雙擊一個(gè)exe程序,os調(diào)用的第一個(gè)函數(shù)是什么?甚至到現(xiàn)在我研究很長時(shí)間后,還是得不到令我滿意的答案。不過在學(xué)習(xí)的過程中我還是有收獲的,下面和大家一起分享一下,我也把這段時(shí)間所學(xué)作一下總結(jié)。???要了解一個(gè).exe程序的啟動(dòng)過程就不得不了解一下有關(guān)操作系統(tǒng)方面的知識(shí),such?as“進(jìn)程,
3、線程,虛擬內(nèi)存"的基本的知識(shí)。當(dāng)然這里我就不詳細(xì)介紹了,有興趣的同學(xué)可以自己去查一查這方面的資料。在未真正開始之前,先統(tǒng)一一下本文出現(xiàn)的一些名詞的含義:???App.exe----------假定為應(yīng)用mfc的AppWizard做出的一個(gè)SDI程序,App是它的名字。你可以把它看為一個(gè)標(biāo)準(zhǔn)的"hello?mfc!"程序。???PE------------不要以為它是“體育課”的縮寫呦。它可是微軟的標(biāo)準(zhǔn)win32可執(zhí)行文件.exe和動(dòng)態(tài)鏈接庫.dll的文件格式,它的Englishname是Portable?Execu
4、table?File?Format。????下面可要正式開始了。????一個(gè)microsoft的.exe程序的啟動(dòng)方法有很多,這里我們以雙擊App.exe圖標(biāo)啟動(dòng)為例(其他方法,我想也是一樣的)。在補(bǔ)充一下,我所用的os是Windows2000Server,所以這里也主要討論win2000下的應(yīng)用程序,過要涉及較多關(guān)于NT內(nèi)核,畢竟微軟主推win2000/winxp和Unicode么。????一個(gè)microsoft的.exe程序的啟動(dòng)過程如下:??(1)當(dāng)我們雙擊App.exe圖標(biāo)啟動(dòng)程序時(shí),系統(tǒng)首先做什么呢,讓我
5、們先聽一聽侯捷是如何說的吧“執(zhí)行起來的App進(jìn)程其實(shí)是shell調(diào)用CreateProcess激活的”----"深入淺出MFC?second?edition"?page39載。很多書上都是如是說的,shell又名“命令解釋器”,是win32操作系統(tǒng)基于瀏覽器的一個(gè)32位用戶接口,它是一個(gè)多線程的好例子,屏幕上每一個(gè)文件夾瀏覽窗口都是它的一個(gè)線程。它是操作系統(tǒng)引導(dǎo)時(shí)加載的系統(tǒng)進(jìn)程,它具體表現(xiàn)為windows?explorer.exe。explorer.exe是所有用戶應(yīng)用程序的創(chuàng)造者。你完全可以將shell看成是所有
6、應(yīng)用程序進(jìn)程的父進(jìn)程,就像桌面(desktop)可看成所有窗口的父窗口一樣。shell的用途很多,如啟動(dòng)應(yīng)用程序,管理文件系統(tǒng),將應(yīng)用程序與相應(yīng)文件相關(guān)聯(lián)等等。我們常見的桌面上的帶有小箭頭的快捷方式(shortcut)就是一個(gè)shell鏈接,shell負(fù)責(zé)管理一個(gè)叫"名字空間"的類似文件系統(tǒng)似的“超文件系統(tǒng)”,它允許應(yīng)用程序在任何地方在不知訪問對(duì)象名字和位置的前提下訪問到這個(gè)對(duì)象,此類對(duì)象有:文件,目錄,驅(qū)動(dòng)器,打印機(jī)以及網(wǎng)絡(luò)資源。而名字空間就是shell把這些對(duì)象有層次組織起來的一個(gè)結(jié)構(gòu)。名字空間為用戶和應(yīng)用程序
7、提供了一種可靠和高效的方法來訪問和管理對(duì)象。好了不論它是什么,反正它調(diào)用了CreateProcess,一切就從這里開始了。??(2)CreateProcess這個(gè)函數(shù)可作了不少工作。App進(jìn)程由此誕生。當(dāng)CreateProcess這個(gè)函數(shù)被調(diào)用,系統(tǒng)就會(huì)創(chuàng)建一個(gè)“進(jìn)程內(nèi)核對(duì)象”。進(jìn)程內(nèi)核對(duì)象可以看作一個(gè)操作系統(tǒng)用來管理進(jìn)程的內(nèi)核對(duì)象,它也是系統(tǒng)用來存放關(guān)于進(jìn)程統(tǒng)計(jì)信息的地方(一個(gè)小的數(shù)據(jù)結(jié)構(gòu)),其實(shí)它的真正創(chuàng)建者是一個(gè)叫NtCreateProcess的windows2000系統(tǒng)服務(wù)函數(shù)(也叫執(zhí)行體服務(wù)函數(shù)),他創(chuàng)建
8、了進(jìn)程內(nèi)核對(duì)象供用戶擴(kuò)展。進(jìn)程內(nèi)核對(duì)象的初始使用計(jì)數(shù)為1。然后系統(tǒng)為該進(jìn)程創(chuàng)建4GB(=2^32)的虛擬地址空間(所謂虛擬就不是真的創(chuàng)建4GB的物理內(nèi)存空間,這些空間不是真在物理內(nèi)存上).用于加載App.exe可執(zhí)行文件和任何必要的dll文件的數(shù)據(jù)和代碼。??(3)下面概述一下系統(tǒng)的加載器(可稱為loader)是如何加載這些東東的。首先了解一下系統(tǒng)為該進(jìn)程創(chuàng)