• 托管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代码编译成本地代码执行。 

    原地址链接:https://www.cnblogs.com/xuanhun/archive/2012/06/23/2559351.html

  • 相关阅读:
    final,static,this,super 关键字总结
    Java基础知识(三)
    Java基础知识(二)
    Java基础知识(一)
    MyBatis重要核心概念
    Mybatis执行SQL的完整过程及四大组件介绍
    Mybatis之plugin插件设计原理
    Spring MVC 9大组件概述
    Log4j的使用
    Git的介绍及使用
  • 原文地址:https://www.cnblogs.com/wwkk/p/11481596.html
Copyright © 2020-2023  润新知