qemu的动态翻译机制
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的动态翻译机制的更多相关文章
- 编译时和运行时、OC中对象的动态编译机制
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java中的动态代理机制
java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- java的动态代理机制
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- 深度剖析JDK动态代理机制
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...
- Java的动态代理机制详解(转)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
随机推荐
- HTML-参考手册: 元素和有效 DOCTYPES
ylbtech-HTML-参考手册: 元素和有效 DOCTYPES 1.返回顶部 1. HTML 元素和有效 DOCTYPES HTML 元素 - 有效 DOCTYPES 下面的表格列出了所有的 HT ...
- spring boot starter开发
作为公司的技术保障部,一直承担着技术方向的把控,最近公司准备全面转入spring boot的开发.所以我们部门也一直在调研相关的技术知识点: 使用springboot开发应用已经有一段时间了,我们都沉 ...
- SQL Server2012创建连接服务器到ORACLE11G
做ETL,肯定少不了经常会从不同的数据库直接进行数据的操作,为了更好的进行跨库操作,SQL SERVER 2012拥有LinkedServer功能.前段时间写了个SQL SERVER同种数据库直接的链 ...
- 接口自动化测试框架-AIM2.0
跳转到3.0版本https://www.cnblogs.com/df888/p/12031649.html AIM是我用python搭建的第一款接口自动化测试框架,随着技术的提升,框架也在升级,故有了 ...
- [ERR] 153 - Got a packet bigger than 'max_allowed_packet' bytes
异常原因: 用客户端导入数据的时候,信息包过大 ,终止了数据导入,需要修改max_allowed_packet 参数 解决方案: 1. sql语句修改( ⚠️重启服务设置会失效) 登陆mysql查看当 ...
- 排序(分组后排序&整排)
一.整排 要求:根据score进行排名,分数相同,名次相同,且连续 表如下图: sql语句: 方法一:select a.score, (select count(distinct b.score) f ...
- XSS注入方式和逃避XSS过滤的常用方法(整理)
(转自黑吧安全网http://www.myhack58.com/) web前端开发常见的安全问题就是会遭遇XSS注入,而常见的XSS注入有以下2种方式: 一.html标签注入 这是最常见的一种,主要入 ...
- 关于java使用json不能够使用报没有导包的问题,以及前后台交互json数据的使用
博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/12/02/%e5%85%b3%e4%ba%8ejava%e4%bd%bf%e7%94%a8 ...
- 初探Remoting双向通信(四)
原 初探Remoting双向通信(四) 2013年06月26日 11:11:32 喜欢特别冷的冬天下着雪 阅读数 2632 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- TypeScript和JavaScript的区别
JavaScript和TypeScript的对比 注:参考https://juejin.im/entry/5a52ed336fb9a01cbd586f9f做的笔记 概要介绍 JavaScript Ja ...