精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入了解.NET編譯器中CLR加載過程

開發 后端
.NET編譯器在生成托管代碼時會將一些重要信息寫入PE文件的header和.text section(后邊我會介紹這些寫入程序集的重要信息是什么),本文介紹CLR加載過程中,當我們雙擊一個托管代碼寫的exe程序時發生的事情。

以下說明CLR加載過程所使用的工具是VS2005+sos.dll,示例程序代碼如下:    using System;

  1. using System.Collections.Generic;  
  2. using System.Text;  
  3.  
  4. namespace hello  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             Int32 a = 1;  
  11.             Int32 b = 2;  
  12.             b = a + b;  
  13.             Console.WriteLine(b);  
  14.  
  15.             Console.ReadKey();  
  16.         }  
  17.     }  

那么CLR加載過程是怎樣的呢?

1、當你雙擊一個.exe文件時,Windows操作系統提供的PE Loader會將該exe文件載入內存;

(1)、首先明確一點,PE Loader問什么能加載exe文件呢?因為exe文件就是一種PE文件,PE(Portable Execute)文件是微軟Windows操作系統上的程序文件,EXE、DLL、OCX、SYS、COM都是PE文件

(2)、有必要了解一下PE文件的結構:

Dos stub

圖 1

1) Dos stub

由100個左右的字節所組成,用來輸出類似“這個程序不能在DOS下運行!”這樣的錯誤信息;

2) PE Signature

DWORD類型,PE文件簽名,用來表示這是個PE文件,用ASCII碼表示;

3) File Header

包含PE文件最基本信息,通過dumpbin可以看到,如圖2所示 從這里可以看到:CPU類型為14c,是Intel I386、I486或者I586;section的數量為2;鏈接器產生這個文件的日期;COFF符號表的文件偏移量,為0;COFF符號表的符號數目,為0;Optional Header的大小。

CLR加載過程命令提示
圖2

4) Optional Header

用來存儲除了基本信息以外的其他重要信息,具體含義大家可以查閱PE文件格式的相關資料,我這里對一些關心的域根據圖3進行一下說明:

-- entry point,指明這個PE文件的入口地址,是一個RVA(相對虛擬地址); -- base of code,代碼塊起始地址的RVA,在內存中,代碼塊通常在PE首部之后,數據塊之前;

 -- base of data,數據塊;

 -- image base,PE文件被鏈接器重定位后的內存地址,可以是鏈接器優化,節省載入時間和空間;

 -- subsystem,可執行文件的用戶界面使用的子系統類型。具體值的含義為:

1 不需要子系統(比如設備驅動)  

2 在Windows圖形用戶界面子系統下運行

3 在Windows字符子系統下運行(控制臺程序)

5 在OS/2字符子系統下運行(僅對OS/2 1.x)

7 在 Posix 字符子系統下運行

所以可以看到我們的程序是一個控制臺程序。

       -- 最后定義了一些數據目錄,具體內容不再贅述。

控制臺程序

                                                                     圖 3

5)  section header

Section header可以有一個或多個,見圖4、圖5、圖6。

-- name,表示這個section的名字,例如這個section的名字為.text;

-- virtual address,保存section中數據被載入內存后的RVA;

-- file pointer to raw data,從文件開頭到section中數據的偏移量。

數據的偏移量
                                                                     圖 4
                                                                        
             -- Section 的原始數據
原始數據
                                                                     圖 5
CLR加載過程

圖 6
 -- CLR頭,從圖7可以找到隨托管代碼IL同時生成的元數據表的RVA。

CLR頭

圖 7

2、PE loader通過查找CLR頭發現該目錄不為空,則自動將mscoree.dll載入進程地址空間中,mscoree.dll一定是唯一的,且總是處于系統目錄的system32下,例如我的機器為C:\WINDOWS\system32目錄下。.net 2.0的mscoree.dll的大小只有256k左右,這個dll被叫做shim,它的作用是連接PE文件和CLR之間的一個橋梁。

3、PE loader接著會找到entry point,例如本例中圖3所示,這個PE文件的入口點地址為0040251E,然后通過這個地址來查找.text section的原始數據表,由圖6所示,0040251E這個地址開始的6個字節的內容為【FF 25 00 20 40 00】,這個內容就是由編譯器寫入PE文件的.text section的重要信息,FF在x86匯編語言與機器碼對照表中代表無條件轉移指令Jmp,這條指令的作用是無條件跳轉到00402000地址處,從圖3可以看到image base 是00400000,2000是import address table的RVA地址,由圖7可以看到,此時程序會跳轉到00402000這個地址所引用的mscoree.dll的_CorExeMain(_CorExeMain為mscoree.dll的入口方法)方法,所有的托管應用都會通過上述過程找到并執行_CorExeMain方法;

4、_CorExeMain方法會幫助程序找到并載入適當的CLR版本,在.net 2.0以后實現CLR的程序集為mscorwks.dllmscorsvr.dll,例如,在我的機器上mscorwks.dll的位置是:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\;

5、啟動CLR服務,開始初始化工作,這個初始化工作包括:

-- 分配一塊內存空間,建立托管堆及其它必要的堆,由GC監控整個托管堆

-- 創建線程池

-- 創建應用程序域(AppDomain):利用sos.dll可以查看CLR創建了哪些AppDomain。

用VS2005打開我們的程序,即時窗口中敲入:.load sos.dll

在VS2005的即時窗口中敲入:后的結果),但是依然可以說明問題:

敲入后的結果

圖 8

由圖8可見,CLR創建了System Domain、Shared Domain和Domain1,這個Domain1是默認Appdomain。

6、接下來就會向默認AppDomain中載入mscorlib.dll,由圖八可見,任何托管代碼,CLR在創建好默認AppDomain后,第一個載入的組件一定是mscorlib.dll,實際上這個組件定義了System.Object、所有基元類型:如System.Int32等,利用sos.dll可以看到有哪些類被載入,依據Domain 1里的Module地址,在即時窗口敲入命令!dumpmodule -mt 790c2000,結果如下,比較長,我只列出部分:

部分命令

圖 9

#p#

從圖9可以看到System.Object被第一個加載進來,接著是System.ICloneable、System.IEnumerable、System.Collection.ICollection、System.Collection.IList、System.Array……

7、產生主線程后可能會觸發一些mscorlib.dll里的類型并加載入內存,接著,當你的PE文件:hello.exe被載入后,默認Appdomain的名字被改為你的PE文件的名字,載入過程完成后的結果可見圖8。

8、包含在mscorwks.dll中的_CorExeMain2方法接管主線程,它將調用System Domain中的SystemDomain::ExecuteMainMethod方法,然后由此方法調用類型加載器的ClassLoader::LoadTypeHandleFromToken方法,該方法會讀取程序集中的元數據表,并在里面查找包含.entrypoint的類型,并返回由EECLASS結構表示的該類型的實例,EECLASS結構中包含重要信息有:指向當前類型父類的指針、指向方法表的指針、實例字段和靜態字段等。

 (1)、在即時窗口敲入命令0097c

圖 10

從圖10可以看到在當前模塊中所定義的類型:hello.Program和所引用的類型:System.Object和System.Console。

(2)、在即時窗口敲入命令后,有如下結果:

結果
圖 11

由圖11可以得到如下信息:為hello.Program類型分配的EECLASS在內存中的地址為00971260,通過這個地址查看其信息,發現hello.Program的父類地址為: 790f8a18,在即時窗口敲入命令790f8a

圖 12

方法表Method Table的地址為00972ff8。

 (3)、方法表里存的是什么呢?其實是當前類型中所有定義和引用到的方法的入口點,這個入口點被叫做Method descriptors,從圖11可以看到。

 (4)、實際上Method descriptors被分為兩個部分,第一部分是m_CodeOrIL,在當前方法沒有被JIT的時候,m_CodeOrIL存的是這個方法的MSIL的RVA,也就是從這個RVA可以找到當前方法的MSIL代碼;第二部分是對JIT編譯器的一個Stub(存根),當方法是第一次被調用的時候,CLR會通過這個Stub調用mscorjit.dll組件,通過m_CodeOrIL里存儲的RVA,找到這個方法對應的MSIL代碼,然后將其編譯為本地CPU指令,假設這里存到地址RVA1,最后將m_CodeOrIL和Stub的值都修改為RVA1,那么當這個方法第二次被調用的時候將會直接通過RVA1去尋找本地代碼,換句話說只有當方法第一次被調用的時候才會被Jit編譯器編譯,之后則直接使用編譯好的本地代碼。同時這也說明托管代碼被編譯了兩次,第一次編譯是將托管代碼編譯為MSIL代碼,并同時生成Metadata元數據文件,第二次編譯發生在方法被調用時由Jit編譯器完成。

(5)、在即時窗口敲入命令!dumpmd 00972fe8和!dumpmd 00972f0可以看到已經被Jit過的和還沒有被Jit的方法的信息:

圖 13

被Jit過得方法則會修改m_CodeOrIL,如Main方法的m_CodeOrIL被指向地址00e50070,而沒有被Jit的方法m_CodeOrIL的值為ffffffffffffffff。

 (6)、在即時窗口敲入命令

圖 14

圖14列出helloProgram.Main方法的本地代碼。而如果在即時窗口敲入命令!u ffffffffffffffff則顯示Unmanaged code。

9、進入Main方法,進而執行后續程序。

最后,從上述分析也可以看出,.NET的幾個核心組件的被調用順序大致是: mscoree.dll -----> mscorwks.dll(mscorsvr.dll)  -----> mscorlib.dll ----->mscorjit.dll。
    一般來說調試.NET程序使用VS2005就可以了,但是要想得到更詳細的信息,如內存情況等就需要借助其他工具了,個人覺得sos.dll和Windbg是很好的工具,Windbg可以在http://www.microsoft.com/whdc/devtools/debugging/default.mspx下載,而如果你裝的是VS2005 Team Version,那么自帶sos.dll。

關于CLR加載過程的詳細內容,大家可以通過微軟的 Shared Source Common Language Infrastructure(SSCLI),來了解關于CLR的一些內部機理,大家可以到

http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en下載,相信會對理解CLR有所幫助,另外就是由蔡學鏞寫的http://www.microsoft.com/taiwan/msdn/columns/DoNet/loader.htm,文章挺早,但很經典,大家可以看看

本文來自Leo Zhang博客園文章《深入了解CLR的加載過程

【編輯推薦】

  1. 淺談CLR 4.0安全模型的運作機制
  2. 淺談CLR線程池的缺點及解決方法
  3. CLR線程池的作用與原理淺析
  4. Mircosoft CLR調試器的簡單介紹
  5. 微軟MVP教你如何看懂.NET CLR基本術語
責任編輯:彭凡 來源: 博客園
相關推薦

2011-02-22 18:09:08

Konqueror

2024-07-18 08:46:58

.NET輕量級計時器測量代碼塊

2009-10-23 09:36:25

.Net Compac

2009-11-03 13:33:39

VB.NET對象列表

2017-01-20 08:30:19

JavaScriptfor循環

2019-11-29 16:21:22

Spring框架集成

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-07-13 09:36:25

2010-06-23 20:31:54

2020-07-20 06:35:55

BashLinux

2024-04-07 00:00:00

.NETILSpy操作指南

2009-09-03 14:26:17

Jit編譯

2010-10-25 14:09:01

Oracle觸發器

2009-08-04 15:52:58

ASP.NET編譯器

2023-06-06 15:31:13

JavaScript開發

2010-11-15 11:40:44

Oracle表空間

2011-07-18 15:08:34

點贊
收藏

51CTO技術棧公眾號

日韩精品一区二区三区在线观看 | 天堂成人在线观看| 亚洲第一黄网| 亚洲精品一区二区三区不| 国产成人手机视频| 国产激情视频在线观看| 成人激情午夜影院| 国产精品v日韩精品| 老湿机69福利| 图片婷婷一区| 在线播放国产精品二区一二区四区| 欧美日韩激情四射| 免费一级在线观看| 国产精品一区二区三区99| 韩国精品美女www爽爽爽视频| 久久久久久亚洲中文字幕无码| 日韩一级视频| 色综合久久久网| 日本一区二区三区四区五区六区| 人妻精品一区二区三区| 美女网站在线免费欧美精品| 欧美黑人一级爽快片淫片高清| 国产人妻大战黑人20p| 免费精品一区二区三区在线观看| 一本色道久久综合亚洲91| 国产精品久久成人免费观看| 日本护士...精品国| 国产一区二区电影| 国产精品久久久久久久久久久久久 | www亚洲国产| 色视频在线观看| 国产乱子伦视频一区二区三区 | 欧美激情不卡| 黑人精品xxx一区一二区| 日日噜噜夜夜狠狠久久丁香五月 | 精品91福利视频| 色吊一区二区三区| 97视频久久久| 91在线中文| 18成人在线观看| 日韩精彩视频| 五月婷婷伊人网| 国产福利91精品一区| 国产精品99久久久久久久久久久久| 毛片aaaaa| 一区二区电影在线观看| 最近2019免费中文字幕视频三| 国产黄色网址在线观看| 国产一区二区三区不卡av| 日韩精品一区二区三区四区视频 | 国产无套内射又大又猛又粗又爽| 日韩情爱电影在线观看| 国产亚洲欧美日韩美女| a天堂中文字幕| 欧美男男gaytwinkfreevideos| 亚洲精品720p| 少妇户外露出[11p]| 卡通动漫国产精品| 精品小视频在线| 黄色性生活一级片| 色婷婷久久久| 亚洲男人第一网站| 成人性生交大免费看| 美女网站色精品尤物极品姐弟| 精品少妇一区二区三区视频免付费 | 欧洲高清一区二区| 国产视频二区在线观看| 久久理论电影网| 欧洲精品久久| av在线播放免费| 亚洲天天做日日做天天谢日日欢 | 熟女人妻在线视频| 亚洲免费福利一区| 亚洲区中文字幕| 黄色片网站免费| 久久社区一区| 久久国产色av| 久久精品久久国产| 亚洲在线观看| 国产欧美日韩精品专区| 国产精品久久影视| 国产精品18久久久久久vr| 国内成+人亚洲| 男人的天堂av高清在线| 国产精品免费网站在线观看| 国产又粗又长又爽视频| 国产精品xx| 91国模大尺度私拍在线视频| 天天干天天综合| 欧美久久亚洲| 精品五月天久久| 免费中文字幕日韩| 亚洲精品123区| 国产精品久久二区| 精品国产av一区二区| 99视频有精品| 中文字幕av日韩精品| heyzo在线欧美播放| 91福利社在线观看| 又黄又爽又色的视频| 青青草久久爱| 夜夜嗨av色一区二区不卡| 国产性xxxx| 久久精品91| 51精品国产人成在线观看| 青青草超碰在线| 亚洲柠檬福利资源导航| 欧美黄网站在线观看| 国产亚洲字幕| 亚洲桃花岛网站| 免费三片在线播放| 日本视频一区二区| 国产在线一区二区三区欧美 | 福利欧美精品在线| 色一区av在线| 久久亚洲精品国产| 国产高清精品久久久久| 视频一区二区综合| sm性调教片在线观看| 欧美高清视频在线高清观看mv色露露十八| www.17c.com喷水少妇| 国产精品91一区二区三区| 69av视频在线播放| 亚洲av无码国产精品久久不卡| 国产日本欧美一区二区| 亚洲不卡中文字幕无码| 九九99久久精品在免费线bt| 在线日韩第一页| 欧美日韩乱国产| 国产91露脸合集magnet| 亚洲综合视频一区| 精品裸体bbb| 亚洲人成电影在线观看天堂色| 国产午夜久久久| 国产精品综合网| 欧美一二三四五区| 午夜欧美激情| 日韩www在线| 久久久久久久99| 成人福利在线看| www.国产二区| 日本少妇精品亚洲第一区| 精品国产欧美一区二区三区成人| 国产又粗又猛又爽又| 久久亚洲免费视频| 精品99在线视频| 少妇高潮一区二区三区| 午夜精品一区二区三区视频免费看| 国产xxxx孕妇| 亚洲精品va在线观看| 在线视频观看一区二区| 91精品亚洲| 91免费精品国偷自产在线| 素人av在线| 678五月天丁香亚洲综合网| 国产又粗又黄又猛| 蜜桃av一区二区三区电影| 亚洲高清视频一区| 亚洲精品第一| 久操成人在线视频| 乱精品一区字幕二区| 午夜久久久久久| aa一级黄色片| 日韩福利电影在线观看| 亚洲自拍的二区三区| 豆花视频一区| 欧美日韩国产成人高清视频| 亚洲精品成人电影| 午夜精品久久久久久久99樱桃| 亚洲色图14p| 视频在线观看国产精品| 亚洲精品一区二区三| 99视频这里有精品| 久久久久国产精品免费网站| 五月天婷婷社区| 欧洲精品在线观看| 欧美手机在线观看| 国产精品自拍一区| 5月婷婷6月丁香| 欧美亚洲激情| 成人免费xxxxx在线观看| 污污的网站在线免费观看| 亚洲精品99久久久久| 日本黄色一级视频| 亚洲欧美一区二区久久| 东京热av一区| 日日摸夜夜添夜夜添国产精品| 亚洲人成网站在线播放2019| 亚洲精品一区二区三区在线| 日韩男女性生活视频| 黄色在线观看网站| 亚洲国产天堂久久综合网| 一区二区乱子伦在线播放| 亚洲精品成人悠悠色影视| 在哪里可以看毛片| 国产精品一二三在| 久久9精品区-无套内射无码| 香蕉久久网站| 蜜桃av噜噜一区二区三| 日日夜夜亚洲精品| 欧美在线一区二区三区四| 蜜桃视频网站在线| 亚洲欧美激情精品一区二区| jlzzjlzzjlzz亚洲人| 色噜噜狠狠色综合中国| 欧美人与禽zozzo禽性配| 国产欧美一区二区精品忘忧草| 中文字幕avav| 日本伊人午夜精品| 69sex久久精品国产麻豆| 精品国产中文字幕第一页| 成人国产1314www色视频| 播放一区二区| 久久免费高清视频| 成人在线视频亚洲| 亚洲人成电影在线| 天堂网av2014| 日韩视频在线一区二区| 九九热最新视频| 欧美日韩国产中文精品字幕自在自线| 蜜桃视频最新网址| 久久亚洲精精品中文字幕早川悠里| 一区二区三区人妻| 久久精品国产99国产精品| 美女日批免费视频| 国模大胆一区二区三区| 午夜欧美性电影| 免费欧美视频| 国产欧美日韩伦理| 视频精品一区二区三区| 成人自拍性视频| 欧美xxxx性| 国产精品久久久久久久久借妻| 深夜在线视频| 午夜精品蜜臀一区二区三区免费| 99热国产在线中文| 久久夜色精品国产亚洲aⅴ| www.亚洲资源| 国产亚洲精品高潮| 国产1区2区3区在线| 亚洲人成电影网站色www| 精品亚洲成a人片在线观看| 亚洲国产天堂网精品网站| 亚洲成人一级片| 日韩欧美三级在线| www.久久综合| 精品国产区一区| 天天操天天射天天| 日韩成人中文字幕| 青青久草在线| 亚洲欧美国内爽妇网| 国产免费a∨片在线观看不卡| 亚洲人成啪啪网站| 国产在线你懂得| 色久欧美在线视频观看| 日本三级视频在线播放| 久久韩剧网电视剧| 91国内在线| 久久久免费精品| 漫画在线观看av| 日本免费在线精品| av成人在线看| 成人激情视频在线观看| 久久伦理中文字幕| 岛国一区二区三区高清视频| 国产精品极品在线观看| 精品欧美日韩| 免费短视频成人日韩| 婷婷久久伊人| 欧美fxxxxxx另类| 我的公把我弄高潮了视频| 亚洲欧美日本日韩| 午夜在线观看av| 国产精品白丝jk黑袜喷水| 无码人妻一区二区三区一| 成人丝袜18视频在线观看| a视频免费观看| 国产情人综合久久777777| 99热在线观看精品| 亚洲国产wwwccc36天堂| 天堂а√在线中文在线新版| 欧美午夜在线一二页| 国产视频第一页| 日韩电视剧免费观看网站| 国产鲁鲁视频在线观看免费| 久久久国产精品亚洲一区| 波多野结衣乳巨码无在线观看| 欧洲美女7788成人免费视频| 爱情电影网av一区二区| 国产一区二区高清视频| 成人动漫免费在线观看| 日韩精品一区二区免费| 久久黄色影院| 亚洲熟妇一区二区| 国产欧美一区二区精品性色| 久久无码精品丰满人妻| 日本道在线观看一区二区| 精品国产伦一区二区三区| 亚洲色图美腿丝袜| 青青在线视频| 国产精品一区二区三区久久久| 大桥未久女教师av一区二区| 亚洲欧美综合一区| 黄色成人在线网站| 99热一区二区| 91一区二区在线| 三级全黄做爰视频| 色94色欧美sute亚洲13| 亚洲爱爱综合网| 日韩中文字幕国产精品| 午夜伦理福利在线| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 无人区在线高清完整免费版 一区二| 91免费看片网站| 最新亚洲精品| 日本五级黄色片| 久久精品国产成人一区二区三区 | 香蕉久久精品日日躁夜夜躁| 久久国产精品免费观看| 蜜桃一区二区三区在线| 亚洲国产第一区| 亚洲第一精品在线| 99这里有精品视频| 日韩视频免费在线| 黄色18在线观看| 国产高清一区视频| 中文字幕午夜精品一区二区三区| 国产免费999| 久久久久久亚洲综合| 午夜毛片在线观看| 亚洲成人xxx| 日本高清成人vr专区| 成人动漫网站在线观看| 欧美一区二区三区高清视频| 国产成人亚洲精品无码h在线| av电影在线观看完整版一区二区| 黄色香蕉视频在线观看| 欧美日韩黄视频| seseavlu视频在线| 国产不卡在线观看| 一区二区导航| 国产成人久久777777| 91丨porny丨户外露出| 国产精品自拍99| 日韩激情视频在线| 是的av在线| 麻豆传媒一区| 久久久久久久欧美精品| 91中文字幕永久在线| 色噜噜狠狠色综合欧洲selulu| 暖暖视频在线免费观看| 日本精品久久久久久久| 亚洲资源网站| youjizzxxxx18| 国产农村妇女精品| 亚洲一区二区视频在线播放| 日韩在线小视频| 久久伊人影院| 精品国产av无码一区二区三区| 成人高清av在线| 中文字幕视频网| 国产一级揄自揄精品视频| 91亚洲视频| 老汉色影院首页| 粉嫩蜜臀av国产精品网站| 韩国av免费观看| 亚洲美女激情视频| 国产福利91精品一区二区| 久久99国产精品一区| 国产成人在线视频网站| 日韩字幕在线观看| 一区二区亚洲精品国产| 国产剧情一区二区在线观看| 欧美高清中文字幕| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲国产综合网| 欧美有码在线视频| 清纯唯美日韩| 在线播放第一页| 色呦呦国产精品| 麻豆av在线免费看| 国产精品伊人日日| 石原莉奈在线亚洲二区| 三级影片在线看| 亚洲精品成人久久| 久久亚洲国产精品尤物| 日韩欧美视频免费在线观看| 91欧美激情一区二区三区成人| 一区二区三区在线免费观看视频| 久久天堂电影网| 日韩欧美在线精品| 日本黄大片一区二区三区| 亚洲国产日韩一区二区| 国产裸舞福利在线视频合集| 古典武侠综合av第一页| 日韩av高清在线观看| 国产精品成人久久| 中文字幕不卡av| 欧美高清视频看片在线观看| 日韩va在线观看|