4、CLR执行程序集中代码和IL代码简介

3、加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及经过vs stdio设置源码编译的目标平台的过程.html

本问主要介绍公共语言加载完程序集以后,执行程序集中的代码的过程.算法

 

1、IL中间语言编程

一、IL简介windows

1、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了C#源代码经过C#编译器生成的最终产物是托管模块,而托管模块是由IL中间语言和元数据组成,IL语言是比大多数机器语言都要高级的语言,IL有如下功能:数组

(1)、能访问和操做对象类型安全

(2)、提供了指令建立和初始化对象数据结构

(3)、调用对象上的虚方法和操做数组编程语言

(4)、提供了抛出和捕捉异常的指令实现错误处理函数

......等等post

所以,可将IL视为一种面向对象的机器语言.

 

二、IL通识

(1)、咱们通常经过C#或者F#或者Visual Basic来编程,而后编译器将它们编译成IL,而后IL和其余机器语言同样,也可使用汇编语言来编写,MS提供了ILAsm.exe的IL汇编器和ILDasm.exe的反汇编器.

(2)、一般高级语言只提供CLR所有功能的一个子集,然而IL汇编语言容许开发人员方法CLR的所有功能,若是你选择的编程语言隐藏了一个你迫切须要的功能,那么你可使用IL汇编语言来实现,或者使用另外一种编程语言来实现

 

三、CLR执行一个方法时发生的事情

(1)、第一次执行

(2)、第二次执行

 若是Main方法第二次调用Console的WriteLine方法,会彻底跳过JITComliler函数,由于第一次已经执行和初始化过了,会执行执行内存块中的代码,执行完毕有返回值,则返回到Main(),没有返回值,则跳转带Main方法,进行下一步操做.

 

注:方法只有在第一次运行时会有JIT进行IL验证和IL编译成本机代码形成的性能损失,之后对该方法的调用都已本机代码的形式全速运行,无需验证IL代码并把它编译成本地代码.

 

四、CLR执行方法时的IL和验证

(1)、IL基于栈

它的全部指令要将操做数压入一个执行栈,并从栈中弹出(pop)结果。因为IL没有提供操做寄存器的指令,全部人们很容易的建立新的语言和编译器,生成面向CLR的代码.

(2)、IL指令"无类型"

例:IL提供了Add指令将压入栈的最后的两个操做数加到一块儿.add指令不分32位和64位版本.当add指令执行时,它判断栈中的操做数的类型,并执行恰当的操做.

(3)、IL指令最大的优点

IL最大的优点并非对底层的抽象,而是应用程序的健壮性和安全性.将IL编译成本机CPU指令时,CLR会检查验证高级IL代码,肯定代码所作的一切操做都是安全的.

例如:会核实调用的每一个方法都有正确数量的参数,传给每一个方法的每一个参数都有正确的类型,每一个方法的返回值都获得了正确的使用,每一个方法都有一个返回语句.

注:托管模块的元数据包含验证过程要用到的全部方法及类型信息.

 

(4)、IL验证对进程产生的影响

windows的每一个进程都有本身的虚拟地址空间,独立空间存在的是由于不能简单的信任一个应用程序的代码。应用程序彻底可能读写无效的内存地址。将每一个Windows进程都放到独立的地址空间,将得到健壮性和稳定性,一个进程干扰不到另外一个进程.

经过验证托管代码,能够确保代码不会不正确地访问内存,不会干扰另外一个应用程序的代码.这样就能够放心地将多个托管应用程序放到同一个Windows虚拟地址空间运行。

注:因为windows进程须要大量的操做系统资源,因此进程数量太多,会损害性能并制约可用的资源。用一个进程运行多个应用程序,减小进程,加强性能,减小所需的资源,健壮性没有丝毫降低,这是托管代码的优点之一.

CLR提供了在一个操做系统进程中执行多个托管应用程序的能力,每一个应用程序都在一个AppDomain中执行,每一个托管Exe文件默认都在它本身的独立地址空间中运行,这个地址空间已有一个AppDomain.

注:IIS和SQL Server可实如今一个进程中运行多个AppDomain.

 

五、CLR执行不安全的代码

C#编译器默认生成安全的代码,代码的安全性能够验证,然而C#编译器也容许开发人员写不安全的代码,不安全的代码容许直接操做内存,并可操做这些地址处的字节。这是一个很强大的功能,不过通常是在提高一个对效率要求极高的算法的时候使用。

然而,使用不安全的代码存在重大风险,这种代码可能会破坏数据结构,危害安全性,甚至形成新的安全漏洞,因此,C#编译器要求不安全的代码都使用unsafe关键字标记.

注:当JIT编译器编译一个unsafe方法时,该程序集必须有System.Security.Permissions.SecurityPermission权限.且System.Security.Permissions.SecurityPermissionFlagd的SkipVerification的标志是否设置,若是设置了,JIT编译器会便宜unsafe的代码.

MS提供了PEVerify.exe的程序,用它检查一个程序集的全部方法,并报告其中不安全代码的方法.

 

六、实现IL代码验证的技术

JIT验证IL代码时.必需要访问全部以来的程序集中包含的元数据.例如:当PEVerify检查程序集时,它必须可以定位并加载应用的全部的程序集.

CLR是采用和平时执行程序集时同样的绑定和探测规则来定位程序集.

相关文章
相关标签/搜索