ExaGear二进制翻译技术简介
发表于 2023/11/15
0
尊敬的鲲鹏开发者你好,为实现鲲鹏应用的快速迁移和极简快发,鲲鹏开发套件DevKit提供了全研发作业流程的功能,降低门槛、提升效率。其中针对无源码迁移的场景,鲲鹏DevKit提供动态二进制翻译工具(ExaGear),实现X86二进制指令在执行过程中直接翻译为鲲鹏指令,无须任何代码修改即可完成无源码的快速迁移。您可以通过本课程的学习来完成ExaGear二进制翻译技术的快速入门。
本文主要介绍了以下知识:
(1)ExaGear二进制翻译技术的概念及基本原理
(2)如何在鲲鹏服务器快速部署ExaGear发布件
(3)通过两个练习熟悉ExaGear在环境变量和目录共享方面的特点
什么是ExaGear二进制翻译技术
1. ExaGear是什么
华为ExaGear是解决无源码业务应用程序跨平台迁移的动态二进制翻译软件。用户在迁移x86软件到鲲鹏平台的过程中,可以通过ExaGear软件直接加载和运行x86二进制程序,无需修改和重构x86存量业务软件。
ExaGear的轻量级翻译引擎在运行过程中把x86业务软件的x86指令翻译为ARM指令并执行,在指令层面保证100%的功能正确性,并且能够在运行过程中进一步执行动态二进制优化,持续提高ARM代码翻译质量,使得程序越跑越快,性能越来越好。
华为ExaGear软件面向HPC,安平,电信,互联网等行业领域,以高可靠、高性能为突破点,目标是全面的软硬件兼容,为用户提供了一个稳定、安全的业务运行环境,让企业用户充分利用ExaGear的兼容性和易用性的优势,从容面对业务的平滑迁移,迎接未来的挑战。
2. ExaGear的基本原理
ExaGear的发布件包含两大部分:ExaGear for Server和ExaGear for Docker。前者支持x86应用程序在鲲鹏Linux系统运行,后者支持x86架构的container在鲲鹏Linux系统运行。
接下来,我们对这两个部分在系统中的位置作一个直观的说明。然后,从功能的角度分三块介绍ExaGear二进制翻译技术。
(1)ExaGear for Server软件栈
ExaGear for Server是一个“中间件”软件解决方案,位于x86应用程序与Linux系统(ARMv8架构的)之间。ExaGear for Server 为用户提供了一个虚拟的x86 Linux OS运行环境,支持运行Linux on x86应用部署运行在ARM64 Linux OS之上,如下图2.1所示。
图2.1 ExaGear for Server软件架构示意图
(2)ExaGear for Docker软件栈
ExaGear for Docker区别于ExaGear for Server的方案,是对运行在ARM64 Docker上的x86架构Container进行指令翻译,使得部署在x86 container上的Linux on x86应用可以运行在ARM64的服务器之上。
图2.2 ExaGear for Docker软件架构示意图
从功能上来讲,ExaGear二进制翻译技术由三部分内容组成:
1)二进制翻译引擎
2)x86应用程序的运行环境
3)动态二进制优化
(3)二进制翻译引擎
ExaGear的二进制翻译引擎就是完成指令翻译的那个部件。它位于x86应用程序(guest程序)与鲲鹏AArch64架构服务器上的Linux系统(host系统)之间。x86应用启动时,ExaGear的二进制翻译引擎接管x86应用的运行,使用二进制翻译技术将x86应用程序翻译成ARM的代码再执行。对最终用户而言,整个x86应用程序翻译再执行的过程是简易且透明的。
二进制翻译引擎读入x86应用程序的源机器码,若二进制翻译程序的Translation Cache存储了已经翻译好的软件代码则直接运行,否则对x86应用程序先进行翻译并添加到Translation Cache和Address lookup table中再执行;当x86应用程序需要调用操作系统API时,二进制翻译引擎通过OS interface virtualization module提供模拟x86应用程序的接口。二进制翻译引擎通过翻译与执行两个阶段的相互交替执行,实现在鲲鹏AArch64架构服务器上模拟x86应用程序运行。
图2.3二进制翻译引擎示意图
表2.1二进制翻译引擎模块介绍
模块名 | 功能 |
---|---|
Translation Cache |
存放翻译后的代码 |
Address lookup table (ALT) |
地址查找表,用于存储X86到ARM代码的映射关系 |
OS interface virtualization |
向翻译后的应用程序提供与操作系统进行通信的类似于源OS的接口 |
Level 1 translator |
X86到ARM代码的快速翻译模块 |
(4)x86运行环境
有了二进制翻译引擎,我们在鲲鹏Linux服务器上运行x86应用程序的条件就具备了一大半,但还需要一个条件作为补充:那就是x86运行环境。因为x86应用程序的执行必然会依赖各种x86格式的库文件和配套的各类配置文件。为此,ExaGear提供了完整的x86应用程序的运行环境,也就是guest文件系统。这样,运行的x86应用程序可见ExaGear提供的guest文件系统,而host的文件系统和ExaGear Server的文件对其不可见。
图2.4 host系统和guest系统的文件系统示意图
其中配置文件/opt/exagear/images/<guest_system_version> /.exagear/vpaths-list包含了host系统和guest系统共享的一系列目录和文件。默认情况以下文件及配置会在host系统和guest系统中共享使用:
1)User accounts user groups
2)user privileges
3)/home directories
4)host configurations
5)network configurations
6)system information provided by Linux kernel
7)devices and disks
8)sockets
9)pidfiles
10)mount points
11)logs
12)temporary files
(5)动态二进制优化
有了二进制翻译引擎和x86运行环境,x86应用程序在鲲鹏Linux系统上的运行条件就完备了。但是呢,x86应用程序在运行的过程会呈现代码热点区域,也就是这部分代码执行时间明显比应用程序的其他部分占比要多。这个热点区域的信息在程序的编译阶段是看不到的,或者是不精确的,但是在运行时,这个信息能被ExaGear识别到。所以,动态二进制优化这个功能就出现了。具体来说就是,根据性能分析计时器触发的结果获取执行比较频繁的代码区域,通过ExaGear的Level 2模块对该段代码进行优化再翻译,将优化后的翻译结果替换原先的翻译结果。ExaGear旨在通过这个技术来提高代码翻译的性能,而且,在实现上采取对guest应用程序异步的翻译来尽可能减少优化所需要的时间。