• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            微塵--KeepMoving

            為了忘卻的記憶
            posts - 3, comments - 2, trackbacks - 0, articles - 13
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
             轉(zhuǎn)自 chenxixia 的 Blog

            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=455591



            設(shè)有一個(gè)Win32下的可執(zhí)行文件MyApp.exe,這是一個(gè)Win32應(yīng)用程序,符合標(biāo)準(zhǔn)的PE格式。MyApp.exe的主要執(zhí)行代碼都集中在其源文件MyApp.cpp中,該文件第一個(gè)被執(zhí)行的函數(shù)是WinMain。初學(xué)者會(huì)認(rèn)為程序就是首先從這個(gè)WinMain函數(shù)開(kāi)始執(zhí)行,其實(shí)不然。

                在WinMain函數(shù)被執(zhí)行之前,有一系列復(fù)雜的加載動(dòng)作,還要執(zhí)行一大段啟動(dòng)代碼。運(yùn)行程序MyApp.exe時(shí),操作系統(tǒng)的加載程序首先為進(jìn)程分配一個(gè)4GB的虛擬地址空間,然后把程序MyApp.exe所占用的磁盤空間作為虛擬內(nèi)存映射到這個(gè)4GB的虛擬地址空間中。一般情況下,會(huì)映射到虛擬地址空間中0X00400000的位置。加載一個(gè)應(yīng)用程序的時(shí)間比一般人所設(shè)想的要少,因?yàn)榧虞d一個(gè)PE文件并不是把這個(gè)文件整個(gè)一次性的從磁盤讀到內(nèi)存中,而是簡(jiǎn)單的做一個(gè)內(nèi)存映射,映射一個(gè)大文件和映射一個(gè)小文件所花費(fèi)的時(shí)間相差無(wú)幾。當(dāng)然,真正執(zhí)行文件中的代碼時(shí),操作系統(tǒng)還是要把存在于磁盤上的虛擬內(nèi)存中的代碼交換到物理內(nèi)存(RAM)中。但是,這種交換也不是把整個(gè)文件所占用的虛擬地址空間一次性的全部從磁盤交換到物理內(nèi)存中,操作系統(tǒng)會(huì)根據(jù)需要和內(nèi)存占用情況交換一頁(yè)或多頁(yè)。當(dāng)然,這種交換是雙向的,即存在于物理內(nèi)存中的一部分當(dāng)前沒(méi)有被使用的頁(yè)也可能被交換到磁盤中。

                接著,系統(tǒng)在內(nèi)核中創(chuàng)建進(jìn)程對(duì)象和主線程對(duì)象以及其它內(nèi)容。

                然后操作系統(tǒng)的加載程序搜索PE文件中的引入表,加載所有應(yīng)用程序所使用的動(dòng)態(tài)鏈接庫(kù)。對(duì)動(dòng)態(tài)鏈接庫(kù)的加載與對(duì)應(yīng)用程序的加載完全類似。

                再接著,操作系統(tǒng)執(zhí)行PE文件首部所指定地址處的代碼,開(kāi)始應(yīng)用程序主線程的執(zhí)行。首先被執(zhí)行的代碼并不是MyApp中的WinMain函數(shù),而是被稱為C Runtime startup code的WinMainCRTStartup函數(shù),該函數(shù)是連接時(shí)由連接程序附加到文件MyApp.exe中的。該函數(shù)得到新進(jìn)程的全部命令行指針和環(huán)境變量的指針,完成一些C運(yùn)行時(shí)全局變量以及C運(yùn)行時(shí)內(nèi)存分配函數(shù)的初始化工作。如果使用C++編程,還要執(zhí)行全局類對(duì)象的構(gòu)造函數(shù)。最后,WinMainCRTStartup函數(shù)調(diào)用WinMain函數(shù)。

               WinMainCRTStartup函數(shù)傳給WinMain函數(shù)的4個(gè)參數(shù)分別為:hInstance、hPrevInstance、lpCmdline、nCmdShow。

                hInstance:該進(jìn)程所對(duì)應(yīng)的應(yīng)用程序當(dāng)前實(shí)例的句柄。WinMainCRTStartup函數(shù)通過(guò)調(diào)用GetStartupInfo函數(shù)獲得該參數(shù)的值。該參數(shù)實(shí)際上是應(yīng)用程序被加載到進(jìn)程虛擬地址空間的地址,通常情況下,對(duì)于大多數(shù)進(jìn)程,該參數(shù)總是0X00400000。

                hPrevInstance:應(yīng)用程序前一實(shí)例的句柄。由于Win32應(yīng)用程序的每一個(gè)實(shí)例總是運(yùn)行在自己的獨(dú)立的進(jìn)程地址空間中,因此,對(duì)于Win32應(yīng)用程序,WinMainCRTStartup函數(shù)傳給該參數(shù)的值總是NULL。如果應(yīng)用程序希望知道是否有另一個(gè)實(shí)例在運(yùn)行,可以通過(guò)線程同步技術(shù),創(chuàng)建一個(gè)具有唯一名稱的互斥量,通過(guò)檢測(cè)這個(gè)互斥量是否存在可以知道是否有另一個(gè)實(shí)例在運(yùn)行。

                lpCmdline:命令行參數(shù)的指針。該指針指向一個(gè)以0結(jié)尾的字符串,該字符串不包括應(yīng)用程序名。

                nCmdShow:指定如何顯示應(yīng)用程序窗口。如果該程序通過(guò)在資源管理器中雙擊圖標(biāo)運(yùn)行,WinMainCRTStartup函數(shù)傳給該參數(shù)的值為SW_SHOWNORMAL。如果通過(guò)在另一個(gè)應(yīng)用程序中調(diào)用CreatProcess函數(shù)運(yùn)行,該參數(shù)由CreatProcess函數(shù)的參數(shù)lpStartupInfo(STARTUPINFO.wShowWindow)指定。



             

            久久99精品国产麻豆宅宅| 久久综合中文字幕| 久久久久久曰本AV免费免费| 国产香蕉久久精品综合网| 久久综合狠狠综合久久综合88| 国产精品久久久久久久久| 久久精品无码免费不卡| 久久99热这里只有精品国产| 久久精品国产亚洲综合色| 一本久久免费视频| 伊人丁香狠狠色综合久久| 2019久久久高清456| 国产高潮国产高潮久久久91| 久久这里只有精品首页| 国产巨作麻豆欧美亚洲综合久久 | AV无码久久久久不卡蜜桃| 99久久人人爽亚洲精品美女| 7777久久久国产精品消防器材| 国产A级毛片久久久精品毛片| 亚洲中文字幕无码久久2020 | 色综合久久无码五十路人妻| 久久99精品国产麻豆蜜芽| 久久99国产精品99久久| 亚洲人成精品久久久久| 精品久久久久中文字幕一区| 国产一区二区精品久久| 无码人妻久久一区二区三区| 久久亚洲国产精品成人AV秋霞| 香蕉久久夜色精品国产小说| 99久久99这里只有免费的精品| 久久99久久99精品免视看动漫| 香蕉久久夜色精品国产尤物| 日本精品久久久久影院日本| 久久国产精品免费一区| 国产亚洲色婷婷久久99精品91| 久久精品九九亚洲精品天堂| 国产精品久久久久无码av| 久久中文字幕一区二区| 伊人色综合久久| 午夜福利91久久福利| 久久精品中文字幕一区|