从x86到ARM,代码移植指北

2023-05-16

最近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移植方面必备的工具书。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从x86到ARM,代码移植指北 的相关文章

随机推荐

  • 新手小白,求教matlab

    用matlab写了个求阶乘的函数 xff0c function y 61 digui n n为元素个数 if n lt 61 1 y 61 1 end y 61 digui n 1 n end 结果显示 xff1a 内存不足 可能的原因是程
  • 字符串有长度限制吗?是多少?

    首先字符串的内容是由一个字符数组 char 来存储的 xff0c 由于数组的长度及索引是整数 xff0c 且String类中返回字符串长度的方法length 的返回值也是int xff0c 所以通过查看java源码中的类Integer我们可
  • C++实现推理, 基于Onnx-simplifier、onnx-tensorrt、TensorRT和Cuda编程

    Cuda基础 深度学习模型推理 为啥需要学习tensorRT 因为需要加速 需要C 43 43 部署 为啥又需要学习cuda编程呢 因为有些前处理 后处理需要cuda编程来并行运算进行加速 比如anchor的解码 nms等后处理 1 CUD
  • nuScenes、Culane数据集、Camera选型及内参标定、TX2外接双目相机ZED

    1 xff1a nuScenes数据集 https zhuanlan zhihu com p 295549692 nuScenes mini data 点云数据集 针对cuda10 0 spconv版本 安装cu100版本 torch 1
  • 指针指向0的问题

    问 xff1a 定义指针变量int a 61 0 是指针变量指向地址为零的数据吗 xff1f 答 xff1a 指针赋0 xff0c 就是不指向任何对象 xff0c 相当于NULL
  • pip install basicsr安装时在Preparing metadata (setup.py)卡住

    pip install basicsr安装时在Preparing metadata setup py 卡住 如下图pip安装basicsr时卡在Preparing metadata 查了很多资料也没解决 xff0c 最后从pypi下载包通过
  • Ros 图(节点,消息,话题)命令

    1 启动守护进程 xff1a roscore xff1a ros 43 core这条命令会启动ros的核心模块 xff0c 我感觉这个是一个守护进程 xff0c 会在11311端口 xff08 可能会有不同的配置 xff09 启动一个soc
  • Android 串口通信(二)

    前言 上一篇中主要介绍了串口基础内容和基于谷歌官方android serialport api库 对Android设备进行的串口操作 xff0c 这篇文章主要介绍基于Usb转串口驱动库usb serial for android 的相关内容
  • DeepMind带来了大魔王阿尔法扣,程序员还有前途吗?

    最近 著名的编程竞赛网站C odeforces 发布了一篇名为 AlphaCode DeepMind Solves Programming Problems on CodeForce 的文章 xff0c 将阿尔法扣 xff08 AlphaC
  • 最优控制理论 四、线性二次型最优控制和LQR

    在前面两节最优控制理论 二 哈密尔顿函数法 xff0c 我们利用Hamilton函数法讨论了终端等式约束的非线性控制系统的最优控制 xff0c 它所解决的是 x
  • 多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结

    多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结 本文基于 吴桐wutong 微信公众号文章完善而来 开源代码总览 名称传感器类型组合类型滤波方法备注RTKLIBG KFGAMP rtklibexplorer h
  • Integer类超详解

    目录 xff08 点击传送 x1f680 x1f680 xff09 前言 Integer的内部结构 1 MAX VALUE 2 MIN VALUE 3 SIZE 4 TYPE 构造方法 1 Integer xff08 int number
  • PPM信号介绍

    原文地址 xff1a http nicekwell net blog 20161223 ppmxin hao jie shao html 我们知道PWM信号可以控制舵机 xff0c 一般信号周期是20ms xff0c 脉宽在500us 25
  • 算法建模语言比较:C的优势(相比于Matlab)

    数据结构定义 structure 方便组织相关数据 union 方便多角度访问数据 xff08 软件角度 硬件角度等 xff09 bit field 方便硬件角度访问数据 内存分配方式 malloc 预先 灵活申请内存空间 xff0c 拓展
  • 学会使用CMakeLists.txt在VScode中搭建C++工程

    目录 一 Cmake 简介 二 常用命令 1 指定 cmake 的最小版本 2 设置项目名称 3 设置变量 3 1 set 直接设置变量的值 3 2 set 追加设置变量的值 3 3 list 追加或者删除变量的值 4 添加第三方库或链接其
  • WIN10源码编译安装QGC-V3.4

    目录 写在前面 环境 安装VS2015 xff08 采用的是社区版 xff09 安装Git xff08 见GIT安装教程 xff09 并克隆QGC源码 安装Qt xff0c 并用Qt进行编译 运行 安装注意事项 写在前面 最近想起来之前有过
  • 飞控固件烧录方法

    目录 写在前面 方法一 方法二 写在前面 整理两个烧录飞控固件的方法 方法一 1 xff09 waf targets bin ardusub upload 这时两个过程 xff0c 第一个过程target 会产生一个 px4 文件 xff0
  • Ubuntu 20.04 LTS 安装qt4 library

    How to Install Qt4 Libraries in Ubuntu 20 04 LTS July 9 2020 3 Comments The Qt4 framework has been removed from Ubuntu 2
  • STM32接入ONENET-实现数据上传和命令下发

    前言 xff1a 使用ONENET平台进行远程传输数据和远程控制开发板是相对简单的事 xff0c 但由于ONENET官方给的代码只对他家的开发板比较友好 xff0c 对于初学者来说修改这些代码相对麻烦 xff0c 所以我就分享一份STM32
  • 从x86到ARM,代码移植指北

    最近ARM架构的处理器从云到端全面开花 xff0c 比如苹果MAC上的ARM架构处理器M1 MAX就堪称王炸 xff0c 华为的鲲鹏系列ARM处理器也已经稳定服务了很长时间 xff0c 目前业内有口皆碑 xff0c 因此基于x86环境编写的