从x86到arm,代码移植指北

beyondma beyondma     2022-10-23     577

关键词:

最近ARM架构的处理器从云到端全面开花,比如苹果MAC上的ARM架构处理器M1 MAX就堪称王炸,华为的鲲鹏系列ARM处理器也已经稳定服务了很长时间,目前业内有口皆碑,因此基于x86环境编写的程序也都需要考虑迁移到ARM架构上去,以适应扑面而来的ARM热潮。

针对这个迁移工作笔者进行了一些预研工作。从目前的情况看基于Java、Python等高级语言开发的程序是很容易移植的,问题的关键在于不少Java的包是调用C语言代码的,这时候就要考虑 .so 的动态库移植及内联的汇编语言移植,其中要点如下。

C语言移植要点

一.解决x86下unsign char问题

-1 的二进制原码是 10000001,它的补码是除了符号外取反加 1,最后补码就是 11111111。 在 x86 架构下,char 默认是有符号的,打印时输出为-1;但是在ARM架构下 char 默认是无符号的,这个二进制的 11111111 正好就是无符号的 255。 所以,出现这种情况的原因就是 x86 架构和ARM架构对于 char 的默认处理不一样,x86默认有符号的char类型,ARM默认无符号的char类型。

对于这种情况,有两种处理方式,一种是修改源代码,把数据类型指定为有符号型,另一种就是在编译时指定参数,把默认无符号型改成默认为有符号型,即在 gcc命令后面加入-fsigned-char 编译选项,示例如下:

aarch64-redhat-linux-gcc -fsigned-char -o transfer test.c

  • 解决x86下值溢出

x86(指令集)中的浮点到整型的转换指令,定义了一个 indefinite integer value——“不确定数值”(64bit:0x8000000000000000),大多数情况下 x86 平台确实都在遵循这个原则,但是在从 double 向无符号整型转换时,又出现了不同的结果。 在这方面ARM的处理则非常清晰和简单,在上溢出或下溢出时,保留整型能表示的最大值或最小值,开发者并不会面对不确定或无法预期的结果。 double 型数据向 long 转换的结果对照如下:

CPU

double

转为long

变量保留值说明

x86

正值超出long

范围0x8000000000000000

indefinite integer value

x86

负值超出long

范围0x8000000000000000

indefinite integer value

ARM

正值超出long

范围0x7FFFFFFFFFFFFFFF

变量赋值最大的正数

ARM

负值超出long

范围0x8000000000000000

变量赋值最大的正数

因此对于C语言的double型也需要着重对于indefinite integer value做溢出检查。

汇编语言移植要点

.解决x86平台SSE、SSE2指令集的迁移问题

SSE、SSE2是x86平台上专属版权的单指令多数据流(SIMD)指令集的简称,SSE、SSE2与ARM架构的处理器上的SVE、SVE2对应。SIMD是指一条指令能处理多条数据,比如对于64位计算机来说,一条经典的指令输入、都输出只能是一个64位长的数据,针对双精度(128位长)类型的变量只能分解成若干个64位数据处理。而SIMD汇编指令可以提供由单一指令处理双精度变量的服务,其输入、输出由两个寄存器叠加组成。

目前针对x86的SSE指令向ARM的SVE汇编指令的迁移工作,已有开源项目可以实现全自动化迁移,项目下载地址:https://github.com/openestuary/sse2neon.git,使用方法如下:

步骤 1:将下载项目中的 SSE2NEON.h 文件拷贝到待移植项目中。

步骤 2 :在源文件中删除如下代码:

步骤 3: 在源代码中包含头文件 SSE2NEON.h。

解决x86平台XCHGL的迁移问题:

xchgl 是 x86 上的汇编指令,作用是交换内存变量的值,而且由于这是单指令操作,因此此操作属于原子操作。而ARM架构处理器上需要用glibc的原子操作接口__atomic_exchange_n 替换。

书籍推荐

在x86程序向ARM架构CPU的移植方面,笔者推荐《ARM嵌入式系统移植实战开发》,本书详细介绍了x86程序向ARM的移植,理论加上大量的实例,是ARM移植方面必备的工具书。

从x86到arm,代码移植指北

...易移植的,问题的关键在于不少Java的包是调用C语言代码的,这时候就要考虑.so的动态库移植及内联的汇编语言移植,其中要点如下。C语言移植要点一.解决x86下unsignchar问题-1的二进制原码是10000001,它的补码... 查看详情

从x86到arm,代码移植指北

...易移植的,问题的关键在于不少Java的包是调用C语言代码的,这时候就要考虑.so的动态库移植及内联的汇编语言移植,其中要点如下。C语言移植要点一.解决x86下unsignchar问题-1的二进制原码是10000001,它的补码... 查看详情

应该使用哪个编译器将 C 代码移植到 ARM?

】应该使用哪个编译器将C代码移植到ARM?【英文标题】:WhichcompilershouldbeusedforportingCcodetoARM?【发布时间】:2013-03-0707:07:28【问题描述】:我是ARM的新手。我已经编写了C代码,但我希望将代码移植到在所有ARM处理器上运行的ARM。... 查看详情

移植libffi到sylixos

...环境:Real-EvoIDE3.2.5虚拟机:Ubuntu14.04本篇仅介绍libffi库的移植过程,包括资源的获取,工程文件的修改以及编译出错处理。移植后的libffi支持ARM、MIPS、PowerPC和x86平台,本文档以x86平台为例进行移植,在完成本文档的操作步骤后... 查看详情

x86平台代码移植到嵌入式平台[交叉编译三方库](代码片段)

...更换编译工具链,写cmake管理项目在Ubuntu下新建文件,把代码copy过来下载三方库源码,用PC端默认的GccG++编译器编译库写cmake管理现有工程,确认cmake可以用2找到嵌入式平台交叉编译工具链拷贝到Ubuntu系统的路径下,这里将工具... 查看详情

c++代码和可执行程序在x86和arm上的区别(代码片段)

从使用上来看,可执行程序肯定是不通用的。armx86生成的可执行程序大小都有差异呢。 但是,如果源码编译,如果环境类似,相同的源码可以直接移植。例如:如下程序👇donut.cpp#include<stdio.h>#include&l... 查看详情

openharmonyliteosc-sky指令集移植指北(代码片段)

摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流。本文分享自华为云社区《OpenHarmonyLiteOS指令集移植指南(C-SKY)》,... 查看详情

紧急求助,关于arm版本下qwt库移植出现的错误

...目标板qt运行库拷贝到目标板上,设置好环境变量,OK!QT移植成功!接下来的工作,是在宿主机上正常编写你的qt程序,然后生成一个对应x86架构的MakeFile,然后再将其中的编译器选项g++(gcc)改成arm-linux-g++(arm-linux-gcc),保存,然后m... 查看详情

移植madplay到arm板(代码片段)

一、环境和软件介绍1、主机环境:Ubuntu16.042、交叉编译器: gccversion4.4.1(SourceryG++Lite2009q3-67)3、ARM板:kernel:2.6.35,SoC:S5PV2104、软件包: zlib-1.2.3 、 libid3tag-0.15.1b.tar.gz 、 libmad-0.15.1b.tar.gz 、 madplay-... 查看详情

linux移植usbch340驱动到arm板,并作测试(代码片段)

文章目录一、安装usbserial驱动1.获得usbserial驱动2.加载usbserial驱动二、安装ch340驱动1.获得ch340驱动源码2.编译ch340驱动源码,生成ko驱动3.加载ch340驱动三、编写程序验证驱动能否正常使用linux-arm开发板在引出USB接口的时候,... 查看详情

移植qt5.3.1到arm

...所以这次移植的是qt5的最新版本号5.3.1。第一步准备好源代码包,这里须要qt的源代码包。和tslib包。tslib我使用的是开发板提供的包。设置交叉编 查看详情

android目前支持那些cpu的移植?

目前在网上看到Android最多的是在ARM和X86运行,能再其他的Cpu上运行么?据说Android的内核编译使用的本身就是ARM的交叉编译器。那么是不是说目前Android是不是无法在其他的Cpu上运行呢?目前据我所知安卓一直就只有ARM的CPU。所以... 查看详情

glmark2gpu跑分工具移植到arm实机上运行(代码片段)

...移植过。因此只能自己去移植一把了。移植到arm实机上的代码请到我的github拉取:https://github.com/fanchenxinok/glmark2_arm顺便点个Star哦 ^@^ 拉完代码就跑可不好,能学习下怎么去移植一个开源程序到自己的arm板也是蛮有意... 查看详情

基于v3s的语音助手移植pyaudio到开发板(代码片段)

基于V3S的语音助手(二)移植pyaudio到开发板1.前期准备portaudio源码pyaudio源码2.交叉编译portaudio配置./configureCC=arm-linux-gnueabihf-gccCXX=CC=arm-linux-gnueabihf-g++--host=arm-linux-gnueabihf 查看详情

在x86的docker中构建tvm的arm环境(代码片段)

...,并提供详细的示例以供验证,其中包括rpc测试代码,acl测试代码,pytorch模型在arm上的推理以及在arm上进行autotvm。  如下图所示,显示的是x86架构的cpu信息:  强烈建议使用ubuntu:20.04这个版本,ub... 查看详情

腾讯微服务框架tars成功移植至arm架构

...知。现在,开发人员可以无缝编程和生成基于Arm服务器的代码。针对Arm的TARS微服务架构可通过AkrainoBlueprint了解。在本文中,我们将介绍4G和5G网络中,移植到Arm架构的TARS项目基本架构和部署场景。TARS和Arm架构移植概览TARS支持多... 查看详情

madplay安装和移植问题(代码片段)

madplay安装和移植问题madplay安装和移植1.madplay在x86安装遇到问题2.madplay移植到开发板madplay安装和移植1.madplay在x86安装遇到问题在对madplay中libid3tag-0.15.1b执行make时候报错/usr/local/lib/libz.a(deflate.o):relocationR_X86_64_PC32againstsymbol 查看详情

madplay安装和移植问题(代码片段)

madplay安装和移植问题madplay安装和移植1.madplay在x86安装遇到问题2.madplay移植到开发板madplay安装和移植1.madplay在x86安装遇到问题在对madplay中libid3tag-0.15.1b执行make时候报错/usr/local/lib/libz.a(deflate.o):relocationR_X86_64_PC32againstsymbol 查看详情