
由于arm芯片对比x86具备成本优势以及功耗优势,再叠加国产化自主可控需求,很多时候,需要工程师将原有x86平台上可运行的程序移植到arm平台。
这种移植通常分四种场景:主流软件场景、有对应的源码的场景、没有源码但对性能没有要求的场景、没有源码但对性能有要求的场景。
1.主流软件场景
这种场景下比较简单,因为随着arm生态的不断完善,主流软件,比如openstack、spark、PostgreSQL、MySQL等都已经做好了对ARM的支持。此时按照官方文档或者网上资料的指引操作即可。
2.有对应源码的场景
对于Java、Python等解释型语言写的程序来说,因为中间层(Java:JVM+字节码;Python:解释器)替上层屏蔽了硬件OS差异,因此迁移比较简单。
而对于C/C++、Go等编译型语言写的程序来说,迁移的过程则要复杂一些,需要替换工具链,依赖库、适配修改编译脚本,移植编译宏、Builtin函数、内联的汇编函数、SIMD相关移植等。工作还是比较繁琐的。
不过,为了提升用户程序的迁移效率,厂家们也推出了相应的工具,比如:华为的鲲鹏DevKit应用迁移工具,阿里的EasyYitian等。有需要的读者可以去它们的官网查阅相关资料。

华为的相关资料的网址:
https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/Plugins_UserGuide/DevKit_Porting_0001.html
阿里的相关资料的网址:
https://help.aliyun.com/zh/ecs/user-guide/easyyitian-migration-tools?spm=a2c4g.11186623.help-menu-25365.d_4_9_7.6fae1636Q4SSsQ
3.没有源码但对性能没有要求的场景
没有源码的场景比较难搞,但聪明的工程师们还是想出了解决方案。那就是软件界的“同声传译”—动态二进制翻译。
动态二进制翻译技术可以在运行时将一种指令集架构的二进制代码转换成另一种架构的二进制代码。比如Intel的Houdini可以将Arm指令动态翻译为x86,微软和高通合作开发了windows系统的x86->Arm的动态翻译技术。
华为也有一款动态二进制翻译工具ExaGear,可将X86或者Arm32指令翻译成Arm64指令。在官网和公开网站找到了一些说明图,大家可以参考下:



动态二进制翻译把复杂留给工具,简单留给用户。但是它的不好的地方,是会带来性能的损耗,在对性能要求比较高的场景下,就不适用了。
4.没有源码,但对性能有要求的场景
找不到源码,但对性能还有要求,这个时候怎么办呢?
这时候就不得不祭出逆向工程这个杀器了。也就是从程序反推出逻辑,重构出代码。
这时,可以使用IDA这个工具,可以将机器码反推成汇编代码和C代码。
通过实时Debug,可以推断出程序的运行逻辑。
从而将核心的逻辑重构出来。
不过这种方法对工程师的基本功要求很高,毕竟重构的过程需要工程师在一堆很没有可读性的代码中,像个侦探一样,抽丝剥茧,熟练应用栈、堆、调试、汇编等底层技能来抽丝剥茧。
不过,友情提示一下,看这种代码,如果借助下KIMI、豆包、deepseek等AI助手,则会大大提升效率。如果大家在进行这项工作的话,不妨一试。
