标题: 从x86到ARM,C和C++实现90%代码自动迁移的方法论 [打印本页] 作者: qufu888 时间: 2020-5-20 16:34 标题: 从x86到ARM,C和C++实现90%代码自动迁移的方法论 x86 与 ARM 之争,已经贯穿了很长时间,过去一直是 x86 架构比较受到市场和开发者的欢迎。但是自从移动互联网、物联网和边缘计算兴起之后,ARM 似乎已经找到最适合自己生存的土壤。
架构之争的平台技术拐点,已然来临。
现在,每个人手上都有一台智能计算终端,移动应用逐渐云化,5G 催生了云游戏的诞生;Web 应用的加密性越来越重要,HTTPS 流量越来越大;大数据分布式并行计算成为主流等,这些都让 x86 架构的不足逐渐显露出来。
所以才会有现在所遇到的情况,即不得不从 x86 上的应用迁移至 ARM 上。但也正因为这是两个完全不同的平台,所以在迁移过程中会遇到各种各样的问题。这也是 DevRun 开发者沙龙–首期【鹏城实验室 & 华为鲲鹏专场】中所重点讲到的问题之一。
以下内容经由 InfoQ 编辑整理自 DevRun 开发者沙龙【鹏城实验室 & 华为鲲鹏专场】中张永正和杨少洪老师的分享。
1鯤鹏软件迁移概述和方法论首先要搞懂:为什么要迁移?[attach]43638[/attach]上图所示为程序执行的过程和对应的计算栈。任何一台计算机都是由硬件和软件组成的,类似于最底层的基础物理原材料、晶体管、寄存器、微架构等都属于硬件层面。而软件层面则特指由高级语言、汇编语言开发的应用程序。要执行这些应用程序,需要底层 CPU 支持由汇编器形成二进制的机器码(由指令和数据组成)去运行。
因此就需要底层计算平台能够支持该 CPU 的指令才可以,这也是在 x86 和鲲鹏编译的区别之处。
在 x86 和鯤鹏上编译之后的指令差异是哪些?可以参照下图左侧,显而易见这是一套非常简单的代码,分别在 x86 和鯤鹏上编译之后形成三点指令差异:
首先是汇编不同,x86 上是两条 mov 指令,通过把 A 和 B 的变量从内存当中取到寄存器,并将两值相加,再由一条 mov 指令写回内存;鯤鹏上则是通过两条 ldr 指令、一条 add 指令以及一条 str 指令完成整个过程。
其次是指令长度不同,x86 上 mov 指令是 24 位的,ldr 指令是 16 位的,在鯤鹏上则都是 32 位;第三则是寄存器不同,x86 和鲲鹏处理器使用的向量寄存器不同,其向量指令级也存在差异。
[attach]43639[/attach]鲲鹏处理器与 x86 处理器的指令差异这也正是做迁移的原因,因为在 x86 上所编译出来的应用程序因为有以上三点的不同,因此无法在鲲鹏上直接运行。
从 x86 到鲲鹏,迁移五步走战略从大量的实践中得以总结出一些规律和方法,主要分为以下 5 个步骤: 1、迁移准备,主要以收集硬件信息和软件栈信息为主;
在这期间,主要收集硬件和软件信息。硬件方面的信息主要是收集芯片和服务器的型号,从而方便提供配置性能差不多的鲲鹏服务器;其次是收集软件栈信息,主要分为操作系统、虚拟机、中间件、编译器、上层依赖的开源软件、商业软件、业务软件等信息。
2、迁移分析,对收集到的信息和软件栈做初步分析,判断是否真正需要迁移,评估迁移的工作量;
[attach]43640[/attach]
下图左侧就是一个非常完善的技术栈,底层有芯片,中间层为 OS、虚拟机、编译器等相对应的运行环境。上层是业务软件,分为开源、自研和商用软件。
开源软件的迁移相对较为简单,其中一部分开源软件在 ARM 上已经被编译好的包,直接下载即可。即便没有现成的编译成果,自行下载原码进行编译也并不复杂方便;自研软件的迁移需要注意语言类型的差异,编译型语言是需要重新编译之后才能运行在新环境上,但是对于解释型的语言来说就没有重新编译的需要,只要更换所依赖的虚拟机就可以;商用软件则较为麻烦一些,首先可以通过联系厂商获取它对应 ARM 架构下的软件版本,如果没有的话就需要寻找有类似功能的软件做替换。