特权级我想在这里就不用多说,大家都比较清楚,说说大家可能不清楚的二进制代码翻译技术。二进制翻译技术简称BT,是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执行。二进制翻译技术将机器代码从源机器平台映射(翻译)至目标机器平台,包括指令语义与硬件资源的映射,使源机器平台上的代码“适应”目标平台。因此翻译后的代码更适应目标机器,具有更高的运行时效率。二进制翻译系统是位于应用程序和计算机硬件之间的一个软件层,它很好地降低了应用程序和底层硬件之间的耦合度,使得二者可以相对独立地发展和变化。二进制翻译也是一种编译技术,它与传统编译的差别在于其编译处理对象不同。传统编译处理的对象是某一种高级语言,经过编译处理生成某种机器的目标代码;二进制翻译处理的对象是某种机器的二进制代码,该二进制代码是通过传统编译过程生成的,经过二进制翻译处理后生成另一种机器的二进制代码。
根据不同的实现方式,二进制翻译技术可分为三大类:解释执行,静态翻译和动态翻译。
ü 代码解释执行
解释执行(Interpretation)过程对源机器代码中的每条指令实时解释执行,系统不保存且不缓存解释过的指令,不需要用户干涉,也不进行任何优化。解释器相对容易开发,比较容易与老的体系结构高度兼容,但效率很差。
ü 静态二进制翻译
在静态二进制翻译(SBT,Static BinaryTranslation)中,代码在运行之前被离线翻译,根据目标机器的指令结构生成一个新的程序,然后直接执行这个翻译后生成的程序。静态翻译器的离线翻译过程不会给程序运行带来额外开销,因此可以充分采用各种优化措施生产高质量代码,**提高运行时效率。
ü 动态二进制翻译
动态二进制翻译(DBT,Dynamic BinaryTranslation)则在程序运行时对执行到的代码片段进行翻译,克服了静态翻译所无法解决的一些困难,如运行时动态信息收集,代码挖掘,自修改代码和精确中断问题。而且动态翻译器对用户完全透明,无需用户干预。虽然动态翻译有上述诸多优点,翻译过程却由于受到动态执行的限制而不能像静态翻译那样进行完全细致的优化,使得翻译生成的代码效率比静态翻译器差。
三种二进制翻译技术的比较
解释执行是最易实现的一种翻译技术,但是其繁琐的实现方式**降低了翻译系统的执行效率。静态翻译虽然能提供高效的运行时性能,但由于无法在静态环境下覆盖所有代码,无法脱离对解释器的依赖。与上述两种相比,动态翻译很好的解决了代码覆盖、自修改代码和精确中断等诸多问题,同时也能提供可接受的执行效率。因此VMware基于动态二进制翻译技术实现了x86架构的CPU的虚拟化。
典型动态二进制翻译系统结构所示,被翻译的代码称为源机器代码,在宿主机上运行的代码称为目标机器代码,一个典型的动态二进制翻译器主要包括两个模块:翻译引擎和执行引擎。其中翻译器引擎负责将源机器代码翻译代码翻译成目标机器代码;执行引擎负责准备目标机器代码运行的上下文环境(Execution Context)然后从目标机器代码缓存中找到源机器代码对应的目标代码并执行。
其基本运行流程如下:
ü 查找(Lookup)阶段
这个阶段查询目标代码块是否存在于目标代码缓存中,如果存在则返回目标块入口地址,如果不存在则进入翻译阶段。
ü 上下文切换(Context Switch)阶段
当一个目标代码块被查询到或者翻译模块生成的时候,二进制翻译系统会执行一次控制权转移。系统会把控制权交给执行模块去运行该目标代码块,目标代码块运行完毕后系统需要恢复执行引擎的控制权。一次控制权转移需要保存程序的上下文环境。
ü 翻译(Translation)阶段
完成从源机器二进制代码到目标机器二进制代码的翻译。包括解码、中间代码优化、编码三个子阶段。
ü 执行和链接(Executing & Linking)阶段
当基本块被翻译生成目标代码块之后,依照源代码的控制流完成目标代码块之间的直接以及间接跳转的链接,并依次运行目标代码块。
3、总结
在没有CPU硬件辅助虚拟化技术之前,对于X86架构的CPU就采用模拟和二进制翻译的技术对CPU进行虚拟化实现,但是模拟的方式存在固有缺陷,并不完全虚拟化了x86的CPU架构。而二进制翻译技术则采用完全不同的思路实现了x86架构的CPU虚拟化。其实对于x86的CPU虚拟化,其难点就在于对其特权指令和敏感指令的虚拟化实现,当然,在实现了CPU的指令这一难题之后,还有一个难题在等着我们!那就是x86架构的CPU调度问题?
在虚拟化环境下,x86架构的CPU有什么调度问题?
1、 虚拟CPU和物理CPU之间的对应关系?
2、 虚拟CPU和物理CPU之间的资源分配?
3、 虚拟CPU和虚拟CPU之间的优先级?
4、 多核虚拟CPU架构vSMP和vNUMA于物理多核CPU架构SMP和NUMA之间的调度和负载均衡?