有关CLR的初学小整理2(可能理解不深刻,望大牛指出)
2015-10-09 10:49
405 查看
针对原文有用的段落,写一写自己的理解,注释:
1.
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
相关文章推荐
- Linux服务器硬件设备信息查看
- Random Script Editor Shortcuts
- Lync 2013边缘服务器部署5—向CA申请证书
- 什么是防御性编程,如何进行防御性编程
- 关于 as! 操作符
- JavaScript一些细节
- openbox设置透明效果
- Oracle Study之--Oracle DG备份之归档日志管理
- 你是否还在为android开发环境的搭建而犯难?
- hibernate映射文件在服务器没有网络的情况下报错
- Jenkins系列之—02Jenkins安装与配置
- 移动应用—— 获盈利的方式
- C++ 单冒号: 和双冒号:: 的作用
- 第五次作业
- google统计ga.js本地化提高网站性能
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- initWithFrame方法的理解
- hive rcfile存储格式
- LevelDB原理探究与代码分析
- Linux终端常用快捷键