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

相关推荐
振南的单片机世界17 小时前
启动流程:上电先取栈顶和复位向量,再进main
arm开发·stm32·嵌入式硬件
振南的单片机世界3 天前
HAL_Delay(1000)真准吗?SysTick的1ms基准从哪来
arm开发·stm32·单片机·嵌入式硬件
带土13 天前
3. ARM寄存器组织
arm开发
xiangw@GZ4 天前
ARM TCM 紧耦合内存与 Cache 架构区别
arm开发·架构
XINVRY-FPGA4 天前
XCKU035-2FBVA676I AMD Xilinx Kintex UltraScale FPGA
arm开发·嵌入式硬件·网络安全·fpga开发·硬件工程·信号处理·fpga
少年、潜行4 天前
IAR FOR ARM 历史版本安装包、安装、注册流程【百度网盘资源】
arm开发·iar·iar历史版本·iar安装
Aaron15884 天前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理
m0_747124534 天前
ARM架构基础知识扫盲
arm开发·架构
海绵宝宝de派小星5 天前
MCP与A2A协议深度解析:Agent时代的“TCP/IP“如何诞生
arm开发·网络协议·tcp/ip·ai
Zephyrus_20235 天前
LSM6DSV16X驱动移植+调试
c语言·arm开发