x86程序移植到arm平台的四种场景及解决方案简介

由于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助手,则会大大提升效率。如果大家在进行这项工作的话,不妨一试。

相关推荐
hongmai66688811 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
隔窗听雨眠2 天前
ARM架构下Logstash与Elasticsearch集群部署完全指南:从环境适配到生产验证
arm开发·elasticsearch·架构
郭老师-嵌入式2 天前
arm linux 移植 udhcp 与 使用
linux·服务器·arm开发
深念Y2 天前
登录日志与管理员审计日志存储决策
前端·arm开发·后端·微服务·云原生·架构
深念Y3 天前
微服务抽取路线图:从胖单体到 ARM 集群
前端·arm开发·数据库·后端·微服务·云原生·架构
亿道电子Emdoor4 天前
【Arm】如何高效实现2兆字节对齐
arm开发·单片机·mcu
姓刘的哦4 天前
STM32的启动流分析
linux·运维·arm开发
zlinear数据采集卡4 天前
FRAM铁电存储器原理深度解析:D223校准参数的“永久保险箱“
arm开发·人工智能·stm32·单片机·fpga开发·开源
喜欢吃燃面5 天前
Linux网络编程深度解析:从Socket API到自定义协议设计
linux·网络·arm开发
rcms152702692185 天前
DS200ADCIH1ADB 输入 / 输出板
arm开发