近年来信创工作和国产化开展的如火如荼,而将应用由X86服务器迁移到华为鲲鹏等ARM系CPU的服务器上一直是一个比较困难的环节,这方面我在工作中还是做了很多工作与预研的,那么这里我就把一些探索和预研中所遇到的一些问题分享给大家,避免大家踩坑。X86向ARM移植困难归其根本原因有两大方面,一是这两种CPU在处理某些类型的溢出时,行为不同,二是由于X86与ARM分与不同的复杂指令集与精简指令集阵营,因此他们的机器指令不能完全一一对应,而部分项目为加速运行效率会使用汇编语言直接编写机器指令以最大程度的对程序进行优化,这也就使得汇编语言部分的代码移植起来非常麻烦。

先说一下结论:

移植起来较为简单的应用类型:

  1. 纯的Java、Python等高级语言开发的程序,比如jetty等web容器
  2. 无状态的比较适合容器化部署的应用,如Nginx。

移植难度中等的应用类型:

  1. C、GO语言编写且不太合适容器化部署的应用
  2. Java与C混合编写,而C语言的部分没有内联汇编代码的应用。

移植难度较高的应用类型:

  1. C为主体,但内联汇编语言进行优化的应用
  2. Java与C混合,且C语言的部分中内联了汇编代码的应用

坑点一. unsign char问题

-这里先说一下原码,补码的概念。比如1 的二进制原码是 10000001,它的补码是除了符号外取反加 1,最后补码就是 11111111。 在 X86 架构下,char 默认是有符号的,所以打印的时候正常打印-1;但是在ARM下 char 默认是无符号的,这个二进制的 11111111 正好就是无符号的 255。所以需要注意在ARM编译程度时,加入-fsigned-char 编译选项以避免这个问题如下:

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

坑点二:值溢出的问题

X86的CPU里浮点到整型的转换指令,定义了一个 indefinite integer value(0x8000000000000000),来处理溢出问题,但从 indefinite integer value中无法判断上溢出还是下溢出。 而这㢇ARM的处理策略则是无论是上溢出还是下溢出时,都保留整型所能表示的最大或最小值,具体对比如下:

CPU

double

转为long

变量保留值说明

x86

正值超出long

范围0x8000000000000000

indefinite integer value

x86

负值超出long

范围0x8000000000000000

indefinite integer value

鲲鹏

正值超出long

范围0x7FFFFFFFFFFFFFFF

变量所能表示最大的正数

鲲鹏

负值超出long

范围0x8000000000000000

变量所能表示最大的正数

因此对于C语言的项目中一定要特别注意进行溢出检查。

坟点三:.解决C语言代码中内联嵌入汇编指令的问题

由于X86架构属于CISC(复杂指令集)而ARM属于RISC(精简指令集)他们在汇编指令上完全不同,部分常用的X86指令在ARM体系下没有对应指令。尤其某些对于效率要求极高的X86体系程序经常用到如SSE、SSE2等多数据流的相关指令。

1、SSE、SSE2简介

SSE是单指令多数据流指令集的简称,对于64位计算机来说,一条经典的指令输入、都输出只能是一个64位长的数据,针对双精度(128位长)类型的变量只能分解成若干个64位数据处理。但是X86中提供了128位的寄存器,并通过SSE指令集提供了很多单指令操作128位数据的指令功能,也就是由单一指令处理双精度变量的服务,其输入、输出均是128位的字长,这极大的提升了X86体系CPU处理双精度数据的效率。

当然目前已有开源的项目实现了ARM平台的SSE相关函数(https://github.com/openestuary/sse2neon.git),按照其README来进行操作即可,但是因为此处涉及敏感信息,我不能把实测数据放上来,只能定性的说X86处理器中SSE指令的硬件实现效率很高,sse2neon项目只是实现了SSE的功能,却无法达到SSE的处理速度,这可能是鲲鹏等ARM系服务器需要更多核心才能与X86服务器对标运算能力的原因。

坑点四、XCHGL问题:

xchgl 是 x86 上的汇编指令,作用是交换内存变量的值,我们知道交换操作需要中间过渡,而且需要执行三条指令,即A->TMP,B->A,TMP->B三步才可完成,而这又是一个常用的X86汇编指令,单指令完成,而且属于原子操作。而鲲鹏上如果需要原子交换变量值,需要用glibc的原子操作接口__atomic_exchange_n 来进行,而且也还是存在刚刚说的效率问题。

虽然总结起来并不多,但这些坑点也真是耗费了很多时间才摸索出来的,通过此篇短文总结一下,希望对读者有所帮助。

信创好难?ARM应用移植避坑指南请收好相关推荐

  1. 购买二手iPhone需要注意什么?这份避坑指南请收好!

    iPhone二手机市场一直非常火热,有时甚至出现供不应求的情况.主要是因为新机的价格不便宜,没什么性价比,很多小伙伴会选择低价购买二手iPhone,价格基本只要新机的二到五折.不过二手机的水深相信大家 ...

  2. 怎么把原来的墙拆掉_电视墙避坑指南要收好!拆掉重装太心累...

    电视墙是家里装修最为重要的一个地方. 相信很多人都想要把电视墙装修得简单又大气,而且还是容易搞卫生的整洁类型~但是,电视墙贴砖过程中,有很多坑需要注意,一不小心就要像下面的业主一样,拆掉重装. 业主反 ...

  3. STM32F407 DP83848驱动调试过程总结(标准库到HAL库移植避坑指南)

    文章目录 移植到正点原子例程 下载ST最新F4平台例程适配 使用CubeMX从头开始 移植标准库上层函数到CubeMX初始化的HAL库 项目要从之前的STM32F107平台移植到STM32F407平台 ...

  4. caption里面能不能加字体颜色的设置_短视频快速加SRT字幕这事 有几条Pr避坑指南请查收...

    最近短视频挺火,特别是微信开始进行"视频号"测试以来,短视频更是很多人挂在嘴边的话题. 窝在家里的这段时间,"假装是极客"也在刻苦钻研视频方面的"新技 ...

  5. 凌恩生物资讯|细菌完成图,坑多专家少——请收下这份避坑指南

    尝试做细菌完成图的你是不是有很多疑问 这份避坑指南请收好! 小坑1."1 +X Contig,0 Gap"代表什么? 答:"1 Contig,0 Gap"的承诺 ...

  6. 17条避坑指南:一份来自谷歌的数据库经验贴

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://medium.com/@rak ...

  7. ext列表禁止滑动_后台列表设计避坑指南(下)

    编辑导语:列表页是后台界面的重要组成之一,上篇说了后台列表设计的"搜索"设计(详情见:后台列表设计避坑指南 上):本篇继续讲剩下的两个部分的"坑"和必坑指南,我 ...

  8. 自由职业者和远程工作者避坑指南

    说到自由工作和远程工作,你应该不会陌生,至少听过,甚至已经经历过.尤其是 2020 年,在疫情的影响下,全国上下很多企事业单位,尤其是互联网相关行业,均启动了远程工作模式,你又有何体会呢? 如果笼统来 ...

  9. 安排!顶会磕盐 避坑指南

    听说,拥有顶会论文就仿佛自带"流量". 很多大厂的校招已经明晃晃的说明有顶会等buff加成的同学优先考虑,甚至可以免笔试直接面试! 当然不仅仅是毕业进大厂需要高区论文作为背书,顶会 ...

  10. 【技术三千问】之《modbus问题难点解析》,避坑指南!

    技术三千问: [技术三千问]之<玩转ART-Pi>,看这篇就够了!干货汇总 [技术三千问]之<AT组件问题汇总与解析>,干货汇总! [技术三千问]之<UART串口问题解析 ...

最新文章

  1. 如何衡量RFID技术在仓库中的价值?
  2. 【100题】第十六题(层序打印树的节点)
  3. ios-http协议
  4. php和python写爬虫-一个简单的Python写的XML爬虫
  5. hdu3018 一笔画问题
  6. 笔记-中项案例题-2017年上-风险管理
  7. sql中的case when
  8. 2019全球AI训练营五地再同发
  9. CAS单点登录系列之原理简单介绍
  10. 好看又实用的英文字体
  11. Python3,csvkit功能竟如此强大,不仅可以转换csv格式文件,还能进行数据处理和分析。
  12. 【详细】endnote中英文文献混排
  13. 使用com.google.code.maven-replacer-plugin插件为前端代码自动添加版本号
  14. 用request模块爬取拉钩招聘信息
  15. 今天是植树节,你“植树”了吗?
  16. 电脑的大脑——CPU
  17. android版本升级5.0,安卓系统升级到Android 5.0教程【详解】
  18. Tex资料及问题解决方案汇总
  19. 用纯CSS让子DIV自适应父DIV的高度
  20. z—libirary最新地址获取,zlibirary地址获取方式,zliabary最新地址,zliabary官网登录方式,zliabary最新登陆

热门文章

  1. 亚马逊查询关键词排名的工具_亚马逊关键词的概念和查找工具
  2. CPU性能的三大主要参数
  3. tan和cot的梗_sin对cos说,今晚我们是tan呢?还是cot呢?是什么意思?
  4. 数据科学分布——Beta分布
  5. 太极图形html5代码,HTML5 Canvas组件绘制太极图案
  6. html 表格输出excel,html中导出excel表格
  7. gatk过滤_GATK--使用转载
  8. pm9screw php,PHP使用Screw把源代码加密
  9. windows 下 c++ 二维码生成库
  10. 互联网企业的职位职位之间的相互关系