文章转帖自《电子发烧友》网站。
发展以CPU 和操作系统为核心的自主软硬件已经成为中国的国家战略。 经过自“十五” 以来的十余年努力, 以“龙芯”、“飞腾”、“申威” 为代表的中国自主CPU 研发取得了长足的进展, 部分设计技术达到了世界先进水平, 并在实际应用方面取得了若干突破, 出现了良好的发展势头。 随着自主CPU应用和产业化的不断深入, 相关的软硬件生态问题变得越来越突出。 虽然自主CPU 都在不同程度上采取了与国外CPU 兼容的技术路线, 如“龙芯” 在取得MIPS 架构授权的基础上采取与MIPS 兼容的策略, 但比起主流的软硬件生态, 如X86 在桌面/服务器领域的软件生态以及ARM 在手持终端领域的软件生态, 自主CPU 在软硬件生态方面还处在很初级的水平, 严重制约了自主CPU 的产业化。
二进制翻译技术是实现跨指令系统兼容的重要手段。 二进制翻译技术在宿主机(host) 上用软件模拟出一个目标机/客户机(guest) 指令系统兼容的CPU 来, 从而在宿主机上执行客户机的二进制代码, 达到兼容的目的。 如在MIPS 计算机上模拟X86 指令系统, 从而实现与X86 兼容。 二进制翻译的最大问题是效率问题, 用软件模拟的CPU 比硬件直接实现的CPU 慢很多。 如在MIPS 计算机上使用二进制翻译的方法运行X86 二进制程序, 比起把该程序直接从源代码编译成MIPS 指令并在MIPS计算机上执行, 运行速度一般有数量级的差异。
通过硬件支持和软硬件协同可以有效提高二进制翻译的效率。 虽然不同的通用指令系统结构在功能上都是完备的, 可以通过指令组合实现各种复杂的功能, 但指令的具体定义不同, 翻译起来就会走弯路。 例如, X86 的每条运算指令都要产生EFLAG 标志位, 如果用MIPS 指令来模拟产生EFLAG 标志, 至少需要几十条指令, 如果在MIPS 中增加专门产生EFLAG 的指令, 则翻译起来就可以做到一一对应。 又如, 访存指令都需要进行虚实地址转换, 从X86 到MIPS 的二进制翻译中, 要先把X86 的虚地址转换成X86 的物理地址, 再把X86 的物理地址作为MIPS 的虚地址转换成MIPS 的物理地址,上述转换过程如果由软件实现, 需要十多条指令, 如果在MIPS 的TLB (translaTIon lookahead buffer)中增加一些特定的支持, 就可以直接把X86 的虚地址翻译成MIPS 的物理地址, 彻底消除虚实地址转换的开销。
龙芯CPU 在兼容MIPS 指令系统的基础上通过MIPS 指令系统的UDI (user defined interface)进行扩充, 增加MIPS 中不具备但X86 和ARM 具备的核心功能, 形成龙芯指令系统LoongISA, 使得从X86 和ARM 的二进制到龙芯CPU 的二进制翻译更加方便。 通过软硬结合的二进制翻译, 在龙芯CPU 上流畅运行X86 和ARM 的主流系统及应用, 以弥补MIPS 架构软件生态的不足。 具体地说:
(1) 在Linux 操作系统上进行从X86 到LoongISA 的系统级二进制翻译, 以运行MS Windows 系统及其应用。
(2) 在Linux 操作系统上进行从X86 到LoongISA 的应用级二进制翻译, 以运行基于Linux 的X86 应用。 虽然Linux 上的多数应用都可以从开源社区获得并编译到MIPS 环境下执行, 但有少数关键商业应用如Oracle 数据库没有开源版本, 需要建立基于Linux 的从X86 到LoongISA 的二进制翻译。
(3) 在Android 操作系统上进行从ARM 到LoongISA 的应用级二进制翻译, 以运行基于Android的ARM 二进制应用。 Android 系统支持MIPS 指令集, 且其多数应用是基于Dalvik 虚拟机的, 在MIPS 系统上运行没有障碍。 但有少量对性能要求较高的应用中插入了ARM 二进制码, 在MIPS 指令系统上无法直接运行, 因此需要建立从ARM 到LoongISA 的应用级二进制翻译。 龙芯CPU 与X86及ARM 兼容策略如图1 所示。
龙芯二进制翻译系统以LoongISA 指令集兼容不同形态的X86, ARM 指令集, 通过技术手段消除单一指令系统的壁垒, 使得MIPS, X86, ARM 等不同指令集的系统及应用软件能够融合到统一的LoongISA 平台上, 不加区别地运行。 作为中间层的二进制翻译器, 充分利用本地硬件支持最大化地提高模拟效率, 对上层应用软件提供目标指令集的虚拟运行环境。 不同二进制的应用软件与运行的硬件平台之间不再具有决定关系, 用于支持软件开发的编译器、汇编器, 以往被绑定在各自特定的CPU 之上, 现在都能为LoongISA 平台提供软件资源。 实验结果表明, 龙芯软硬结合的二进制翻译技术可以成数量级地提高从X86/ARM 到MIPS 的二进制翻译效率。