CLR寄宿(中) 托管exe文件的加载和执行

CLR寄宿()  托管exe文件的加载和执行

托管exe文件加载和执行过程在之前的文章做过简要介绍,现在结合本章内容进行详细分析。

托管exe文件被启动时候,首先被PE Loader载入。PE Loader载入exe文件之后,会分析PE文件头data directory table,如果CLR_Header值不为0,表示该文件是托管PE文件,PE Loader 会立即载入 MsCorEE.dll,并且执行 MsCorEE.dll_CorExeMain()函数。

如果是Windows XP以前版本操作系统(比如Windows 2000),当Windows 2000 Loader exe文件载入之后,会检查PE Header data directory table,将Import Table 所记录数据都载入内存,就是MsCorEE.dll。接着找出 PE header 内程序入口点,并执行此处代码。这是 x86 机器码,由编译器自动产生,只有一道指令 (6 bytes),为“FF 25 00 20 40 00,翻译成 x86汇编语言就是“JMP DWORD PTR [402000]”,其中 0x00400000 exe文件 image base,而 0x2000 import address table RVA (此处是_CorExeMain() 偏移地址),所以执行“JMP DWORD PTR [402000]结果会跳到 MsCorEE.dll _CorExeMain()

在执行_CorExeMain()之后,其中代码首先判断需要载入CLR版本。

CLR启动之后,接下来要做就是初始化工作,为托管程序建立进程,申请内存空间,建立线程池和应用程序域。第一个建立应用程序域被称为Default AppDomain

初始化之后,要载入MsCorLib.dll组件和其中模块。

模块载入之后,会调用class loader 来载入 MsCorLib 内相关 class载入 class 顺序依次为:

1)        System.Object

2)        System.ICloneable

3)        System.Collections.IEnumerable

4)        ……

5)        System.AppDomain

6)        System.LoaderOptimization

7)        System.Runtime.Remoting.Proxies.__TransparentProxy

注意 此时并未载入 MsCorLib 内全部 class,只载入目前需要 class

载入class之后,CLR会生成主线程,生成主线程又需要载入以下类:

System.Threading.Monitor

System.IAppDomainSetup

System.AppDomainSetup

System.Char

System.Runtime.InteropServices.RuntimeEnvironment

System.RuntimeFieldHandle

System.Runtime.CompilerServices.RuntimeHelpers

System.Environment

主线程生成之后就是载入应用程序组件到应用程序域,之后才真正进入应用程序主函数。

进入Main()函数之后,会调用JIT编译器将IL代码编译成本地代码执行。 

posted @ 2012-06-23 16:05  玄魂  阅读(1488)  评论(1编辑  收藏  举报