CLR执行模式之程序集代码的执行

所知IL是与CPU无关的机器语言,其能访问和操作对象类型,并提供指令来创建和初始化对象,调用对象上的虚方法以及直接操作数组对象等,故可视为一种面向对象的机器语言。每种语言的存在都有其存在的价值和原因,同时各自有各自的优势,由于CLR的独特性,可以尝试用不同语言描述不同功能(必须是面向CLR的编译器语言)。

在方法执行时,需把方法的IL转换成本机CPU指令,这是JIT编译器的职责。一个方法首次调用时:

CLR在Main方法执行之前会检测其代码所引用的所有类型,并分配一个内部数据结构来管理对引用类型的访问。例如在Main方法内有Console.WriteLine("");

此时在这个内部数据结构,Console类型定义的每个方法都有一个对应的记录项,每个记录项都含有一个地址,根据此地址找到方法的具体实现。对这个结构初始化时,CLR将每个记

录项都设置成包含在CLR内部的一个未编档函数。该函数称为JITCompiler。当首次调用WriteLine时,JITCompiler函数会被调用,并将方法的IL代码编译成本机的CPU指令,保存到

动态分配的内存块中。然后JC回到CLR为类型创建内部数据结构,找到被调用方法对应的那条记录,修改最初对JC的引用使其指向内存块的地址,最后JC函数跳转到内存块中的代码

(方法的具体实现),代码执行完毕返回继续执行后续代码。

整个过程有点繁琐,大致就是分两步走,第一步找到具体方法的地址,初始化数据结构,编译成指令。第二步回到CLR找到方法的记录,执行完毕返回。当Main再次调用WriteLine时,由于对WriteLine的代码进行了验证和编译,所以会直接执行内存块中的代码,完全跳过JC函数。很显然,当应用程序终止,编译好的代码也会被丢弃。(粗浅了解,忘指证)

时间: 2024-11-23 21:15:55

CLR执行模式之程序集代码的执行的相关文章

Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe AIR中使用Flex连接Sqlite数据库(3)(查询) Adobe AIR中使用Flex连接Sqlite数据库(4)(事务) Flex,Fms3相关文章索引 Fms3和Flex打造在线多人视频会议和视频聊天(附原代码) 免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码))

CLR执行模式之托管代码程序集浅析

CLR即公共语言运行时,是一个可由多种编程语言使用的‘运行时’,其核心功能(内存管理,程序集加载,安全性,异常处理和线程同步等)均可由面向CLR的所有语言使用.运行时不必关心开发人员用哪一种语言写源代码,只要编译器是面向CLR的. 通过语言对应的编译器检查语法和分析源码编译生成某些托管模块(PE32或PE32+)通过数据执行保护(DEP)和地址空间布局随机化(ASLR)增强整个系统的安全性.接下来详说其主要组成部分: PE32或PE32+:标准Windows PE文件头(一种格式),使用PE32

CLR的执行模型(4):执行程序集的代码

一直觉得,一本书的第一章是一定要读通的,这样子才知道这本书适不适合自己.所以,对于第一章的内容,我就啰嗦一些了. 托管程序集同时包含元数据和IL.IL是和CPU无关的机器语言,并且比大多数CPU语言都高级.IL能访问和操作对象类型,并且提供了创建和初始化对象的指令.调用对象上的虚方法以及直接操作数组元素.甚至实现了抛出和捕捉异常的指令,所以可将IL看成一种机器语言. 为了执行方法,首先必须吧方法的IL转换成本机CPU指令.这是CLR的JIT的职责. 下图展示了一个方法首次调用时候发生的事情: 在

处理器执行模式+进程切换

大多数处理器至少支持两种执行模式.某些指令只能在特权模式下执行,包括读取或者改变诸如程序状态字之类控制寄存器的指令.原始IO指令和内存管理相关的指令.另外,有一部分内存区域仅在特权下可以被访问到. 非特权态常被称为用户态,这是因为用户程序通常在该模式下执行:特权态可称作系统态.控制态或者内核态,内核态指的是操作系统的内核,这是操作系统中包含重要系统功能的部分. 这样产生了两个问题:处理器如何知道它正在什么模式下执行以及如何改变这一模式.对第一个问题,程序状态字中有一个位表示执行模式,这一位应某些

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

9_任意代码执行(字符串转换成代码执行)

一.背景介绍 当应用在调用一些能将字符串转化为代码的函数(如php中的eval)时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞.狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当用户能够控制这段字符串时,将产生代码注入代码注入漏洞(也称命令执行).广义上的代码注入,可以覆盖大半安全漏洞的分类. 二.漏洞成因 几种常用语言,都有将字符串转化成代码去执行的相关函数. PHP:eval assert Python:exec

C#动态执行字符串(动态创建代码)

在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: using System; using System.Data; using System.Configuration; using System.Text; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflec

深入理解JVM_java代码的执行机制01

本章学习重点: 1.Jvm: 如何将java代码编译为class文件. 如何装载class文件及如何执行class文件. jvm如何进行内存分配和回收. jvm多线程:线程资源同步机制和线程之间交互的机制. 3.1 java代码的执行机制 java源码编译机制. 1.三个步骤: 分析和输入到符号表(Parse and Enter) Parse过程所做的为词法和语法分析. 词法分析:将代码字符串转变为Token序列. 语法分析:根据语法由Token序列生成抽象语法树. Enter过程为将符合好输入

如何执行字符串的PHP代码

最近因项目需要,引出一个议题:如何执行字符串的php代码(php和html混写).注:传统情况下,php代码存储在文件中,直接运行文件即可.以下讨论的情况是,如果php代码是从数据库中获取到,那么要如何运行? 最直观的方案 将字符串代码写到临时文件,然后在项目中include该文件,执行完成再删除这个临时文件 system exec 之类的系统函数 php函数eval (会不会有安全问题?) 进一步的瞎想 把字符串代码当做参数,传入到php的cli或者php-fpm中运行 重新定义include