qemu的作者在QEMU, a Fast and Portable Dynamic Translator一文提到了qemu的动态翻译机制,

大致可以总结为如下过程:

目标代码中的一条指令

|--(1)

微操作(Micro Op)

|--(2)

主机代码

过程1:  

qemu将目标代码的指令一条条地解释为微操作(Micro Op)。

通常来说,一条目标指令,可能被解释成一条或者几条微操作,因此这个过程是会让目标代码的执行过程比原来慢的。

微操作是精挑细选的,它们的组合基本上可以完整地表示不同体系下的所有指令。

从目标代码中的指令,到微操作的转换过程是由qemu中手工编写的代码完成的。

过程2:

从微操作到主机系统的转换过程,不再像过程1那样需要很多手工编码操作,它实际上是复用了GNU C编译器的既有功能,

因为微操作是用C语言编码的,所以直接将这些微操作通过GNU C编译器编译成主机系统的代码,这是一个很取巧的做法。

事实上,当qemu在运行阶段,这个编译过程已经完成了,即每个微操作的主机代码已经生成了,就像是我们已经在手头上有

了一大把的零件,只需要将这些零件按照目标文件的图纸组装在一起,就生成了一个可以在主机系统上运行的程序。这个过程

应该就是qemu的核心设计了。

总结起来就是,过程1是体力活,过程2是技术活。

因为过程2中还有一些精妙的设计。

1/ 每个微操作都被编写成一个C函数,一般都是很简短的C函数;

2/ 微操作中如果有常数参数,比如jmp XXX,这XXX是我们动态生成的,要怎样让它能够作为“常数”形式写到主机代码中呢?

答案是用到了GNU C编译器的relocate功能,C程序如果引用到了内存地址的话,因为无法编译时无法预计运行时的某个变量或者函数的地址,

因此编译时并不能准确地解释这个地址具体是多少,编译时都会将这个对内存地址的引用位置用0x00000000(32位系统)代替,再通过维护一张

重定位表(relocation table),来指定代码中哪些位置应该到用哪些运行时的地址填充。

qemu就是利用了这个机制,用对内存地址的引用给常数先占个位置,然后自己用常数的具体值再覆盖掉这个位置,反正这些代码qemu马上就要组装

执行了,也不需要GNU C的链接器真正去做链接操作了。

3/ 在组装过程中,qemu使用C函数memcpy将微操作的C函数生成的目标代码,去掉GNU C编译器生成的prologue/epilogue,直接拷贝到主机代码缓存gen_code_ptr中。

而微操作的主机代码位于opc_ptr处,参数位于opparam_ptr位置。

qemu的动态翻译机制的更多相关文章

  1. 编译时和运行时、OC中对象的动态编译机制

    编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...

  2. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  3. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  4. java中的动态代理机制

    java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...

  5. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  6. java的动态代理机制

    前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...

  7. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  8. 深度剖析JDK动态代理机制

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...

  9. Java的动态代理机制详解(转)

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

随机推荐

  1. IE8 indexOf

    因为ie8中的js数组没有indexOf方法,所以使用之前要先加入这段js代码 if (!Array.prototype.indexOf) { Array.prototype.indexOf = fu ...

  2. 导数与偏导数 Derivative and Partial Derivative

    之前做了很长时间“罗辑思维”的听众,罗胖子曾经讲起过,我们这一代人该如何学习.其中,就讲到我们这个岁数,已经不可能再去从头到尾的学习一门又一门工具课程了,而是在学习某一领域时,有目的的去翻阅工具课程中 ...

  3. Rust <9>:启用第三方库的备选 features

  4. 基于MFC的Media Player播放器的制作(4---功能实现代码)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. PandaPlayerDlg.h // PandaPlayerDlg.h : header file // //{{AFX_INCLUDE ...

  5. React-Native 指定模拟器RUN-IOS

    react-native run-ios --simulator "iPhone 7”

  6. Permission denied

    记录在一次启动tomcat时提示:Permission denied 信息. 解释一下Permission denied的意思-没有权限 解决办法: sudo chmod -R 777 某一目录其中- ...

  7. android中的文件存储

    Context类中提供的IO方法: FileOutputSream openFileOutput(String name, int mode):打开应用程序中的/data/data/<应用程序的 ...

  8. JS浏览器事件循环机制

    文章来自我的 github 博客,包括技术输出和学习笔记,欢迎star. 先来明白些概念性内容. 进程.线程 进程是系统分配的独立资源,是 CPU 资源分配的基本单位,进程是由一个或者多个线程组成的. ...

  9. java web session共享

    一 搭建环境 操作系统:windows 7 64位 http server:nginx 1.9.7 缓存系统:memcached Servlet容器:apache-tomcat-7.0.65 二 搭建 ...

  10. window 下总是object_detection/protos/*.proto: No such file or directory

    这是因为目前的protoc3.5有Bug,换成3.4就好了https://github.com/google/protobuf/releases/tag/v3.4.0