zoukankan      html  css  js  c++  java
  • 有关CLR的初学小整理2(可能理解不深刻,望大牛指出)

    针对原文有用的段落,写一写自己的理解,注释:

    1.

    托管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()。[注:此处 基址 和 偏移 都是 .Net编译器 自动产生的 固定 数值]
    
    在执行_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

    -
    2. 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代码编译成本地代码执行。

    参考文章链接:http://www.cnblogs.com/xuanhun/archive/2012/06/23/2559351.html
  • 相关阅读:
    14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp
    14.1 NFS介绍 14.2 NFS服务端安装配置 14.3 NFS配置选项
    13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复
    13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令
    12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_basedir 12.24 php-fpm进程管理
    12.17 Nginx负载均衡 12.18 ssl原理 12.19 生成ssl密钥对 12.20 Nginx配置ssl
    12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
    在界面workspacebar上添加的OnContextMenu函数打的断点始终进不去,显示当前不会命中断点还未为文档加载任何符号
    VS2019安装闪退, 不出现安装界面,解决办法
    BCGP单元格多列合并需要注意的
  • 原文地址:https://www.cnblogs.com/x-poior/p/4863278.html
Copyright © 2011-2022 走看看