应用软件迁移与适配

一、背景

国家进入全面国产化时代,xc替代是每一个IT人需要了解掌握的技能,本章我们将学习到xc行业背景、发展、未来前景。

1.应用系统适配与迁移概述

2.应用适配与迁移

3、应用需要迁移的原因:
  • (1)汇编代码角度

同样的C语言代码,在编译成不同架构下的程序后,得到的汇编代码是不同的,这些不同点主要体现在以下3个方面:

  • (2)处理器指令 

以简单的给变量赋值操作为例:

int main()
{
   int a=1;
   int b=2;
   int c=0;
   c=a+b
   return c;
}

X86平台编译后的指令:

  • ARM平台编译后的指令:
  • 2.1鲲鹏架构。 

首先使用mov指令把操作数传送给寄存器,然后使用ldr指令把寄存器的值传送到内存。 

  • (x86架构: 

直接使用movl指令把操作数传送到内存。 

鲲鹏架构和x86架构在具体的处理器指令设计上,是有重大区别的,同样的功能,两个架构的处理器指令实现的方式可能不一样。 

  • (3) 寄存器 :
  • 两个架构下的寄存器不管是数量还是功能都有所不同。比如:

(3.1)鲲鹏架构。

ARM 64有34个寄存器,其中编号x0~x29是通用寄存器,x30为程序链接寄存器,x31比较特殊,它有时候用作xzr零寄存器,有时候是栈指针寄存器sp,两者不能在一条指令里共存,另外两个寄存器是程序计数器PC、状态寄存器CPSR。

ARM 64寄存器x0~x30及xzr零寄存器都是64位的,它们的低32位构成了32位寄存器,分别用w0~w30表示,用wzr表示32位下的零寄存器。

除此之外,ARM 64还有浮点寄存器和向量寄存器。

(3.2)x86-64架构。

x86-64架构下有16个64位的通用寄存器,这些寄存器支持访问低位,例如访问低8位、低16位、低32位。

(3.3) 指令长度 

x86下指令的长度是不一样的,短的只有1字节,而长的却有15字节,给寻址带来了一定的不便。

鲲鹏架构指令长度为固定的32位(ARM工作状态),寻址方便,效率较高。

4、国产化历程

XC:信息技术应用创新产业。

863计划:1986年3月启动实施的“高技术研究发展计划(863计划)” ,旨在提高我国自主创新能力,坚持战略性、前沿性和前瞻性,以前沿技术研究发展为重点,统筹部署高技术的集成应用和产业化示范,充分发挥高技术引领未来发展的先导作用。

核高基:是对核心电子器件、高端通用芯片及基础软件产品的简称,是2006年国务院发布的《国家中长期科学和技术发展规划纲要(2006-2020年)》中与载人航天、探月工程并列的16个重大科技专项之一。

AK:面向党政的具备安全可靠特性的国产化替代项目,信息技术应用创新的前身。

二、基本迁移过程

应用迁移步骤:

数据库迁移步骤:

基本移植思路:

1.源代码修改:

对于源代码修改的场景,主要分为以下几种:

1.1 对内嵌的汇编指令的修改 X86架构和鲲鹏在汇编指令上完全不同,对于在编译型语言中内嵌的汇编指令,需要根据目标架构指令集的具体情况进行有针对性更改。

1.2 char数据类型的修改,把char数据类型更改为signed char。

1.3 双精度浮点型转整型溢出处理的修改。

2.编译选项修改:

2.1 char数据类型默认无符号 编译时指定- fsigned-char选项。如果是从鲲鹏架构移植到X86架构,可以使用-funsigned-char来保持char类型为无符号型。

2.2 指定编译64位应用 X86架构下需要指定编译选项- m64 鲲鹏架构下- mabi=lp64

2.3 目标指令集 指定编译选项为-march=ARMv8-a。

2.4 编译宏 gcc预先内置了各种宏定义,这些宏定义有一部分是和架构有关系的。也可以自定义宏。

1、在X86架构系统完成以下操作:

2、在Arm架构系统下完成以下操作:

3、移植过程

1.编译修改

[root@jd1 code]#gcc -fsigned-chgr -o demo demo.c

[root@jd1 code]#./demo
num = -1

2.修改源码

#include <stdio.h
>
int main()

{
signed char num=-1;

printf("num =%d\n",num);

return 0;
}
[root@jd1 code]# gcc-o demo2 demo2.c
[root@jd1 code]#./demo2
num三 -1

三:迁移适配RPM打包

RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。

有时候为了方便源码包的安装,我们有自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包。spec file是制作rpm包最核心的部分rpm包的制作就是根据spec file来实现的。

1、实验步骤:

前提准备:

RPMbui ld环境准备

(RPMbuild是用于创建RPM的二进制软件包和源码软件包的命令行工具)

#yum install rpm-build rpmdevtools rpmlint -y
  •  

    执行以下命令,观察RPMbuild的目录架构

#rpmdev-setuptree
#cd 
#tree rpmbuild

SPECFILE

SPECFILE 文件是rpm打包的灵魂,大家可以把rpm打包的过程想成盖一个大楼。SPECFILE就是那个图纸,一切都要围绕它来。

步骤1

执行rpmdev-setuptree ,创建rpmbuild目录(x86上制作 rpm demo)

[root@node1 ~]# rpmdev-setuptree  
步骤2

创建Demo软件包,等一下我们会通过rpm发布这个demo包。

[root@node1 ~]# mkdir rpmbuild-1.0
[root@node1 ~]# vim rpmbuild-1.0/rpmbuild_hello.sh
[root@node1 ~]# cat rpmbuild-1.0/rpmbuild_hello.sh
#!/usr/bin/env bash
echo "Hello rpmbuild"
[root@node1 ~]# chmod +x rpmbuild-1.0/rpmbuild_hello.sh
步骤3

打包

[root@node1 ~]# tar czvf rpmbuild/SOURCES/rpmbuild-1.0.tar.gz rpmbuild-1.0/
rpmbuild-1.0/
rpmbuild-1.0/rpmbuild_hello.sh
步骤4

创建与编辑SPECFILE

[root@node1 ~]# rpmdev-newspec rpmbuild/SPECS/rpmbuild.spec
rpmbuild/SPECS/rpmbuid.spec created; type minimal, rpm version >= 4.15.
[root@node1 ~]# vim rpmbuild/SPECS/rpmbuild.spec
步骤5

生成rpm包

[root@node1 ~]# rpmbuild -bb rpmbuild/SPECS/rpmbuild.spec
[root@node1 ~]# ls rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm
rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm

步骤6 安装rpm包并测试

[root@node1 ~]# rpm -ivh rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:rpmbuild-1.0-1.ky10              ################################# [100%]

[root@node1 ~]# rpm -ql rpmbuild
/opt/rpmbuild/rpmbuild_hello.sh
[root@node1 ~]# /opt/rpmbuild/rpmbuild_hello.sh
Hello rpmbuild

看到以上内容,则测试通过,代表我们制作的rpm包可以正常使用。

2、

步骤1

执行rpmdev-setuptree ,创建rpmbuild目录

apt-get install rpm
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
chmod -R 755 ~/rpmbuild
[root@jd1 ~]# rpmdev-setuptree  
步骤2

创建Demo软件包,等一下我们会通过rpm发布这个demo包。

[root@jd1 ~]#  mkdir rpmbuild-1.0
[root@jd1 ~]#  vim rpmbuild-1.0/rpmbuild_hello.sh
[root@jd1 ~]#  cat rpmbuild-1.0/rpmbuild_hello.sh
#!/usr/bin/env bash
echo "Hello rpmbuild"
赋执行的权限:
[root@jd1 ~]#  chmod +x rpmbuild-1.0/rpmbuild_hello.sh

步骤3

打包

[root@jd1 ~]#  tar czvf rpmbuild-1.0.tar.gz rpmbuild-1.0/
rpmbuild-1.0/
rpmbuild-1.0/rpmbuild_hello.sh
步骤4

创建与编辑SPECFILE

[root@jd1 ~]#  rpmdev-newspec rpmbuild/SPECS/rpmbuild.spec
rpmbuild/SPECS/rpmbuid.spec created; type minimal, rpm version >= 4.15.
[root@jd1 ~]#  vim rpmbuild/SPECS/rpmbuild.spec

步骤5

生成rpm包2

[root@jd1 ~]#  rpmbuild -bb rpmbuild/SPECS/rpmbuild.spec
[root@jd1 ~]# ls rpmbuild/RPMS/aarch64/rpmbuild-1.0-1.aarch64.rpm
rpmbuild/RPMS/aarch64/rpmbuild-1.0-1.ky10.aarch64.rpm

步骤6

安装rpm包并测试

apt install alien
[root@jd1 ~]# rpm -ivh rpmbuild/RPMS/aarch64/rpmbuild-1.0-1.aarch64.rpm --nodeps --force

Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:rpmbuild-1.0-1.ky10              ################################# [100%]

[root@jd1 ~]# rpm -ql rpmbuild
/opt/rpmbuild/rpmbuild_hello.sh
[root@jd1 ~]# /opt/rpmbuild/rpmbuild_hello.sh
Hello rpmbuild

四、认识ARM

1、ARM架构

ARM是英国Acorn公司从1983年开始的一个项目,该公司1985年开发出ARM1样本,1986年开始实际生产32位的ARM2。

1990年Acorn成立ARM公司,继续负责ARM架构的开发。

2016年日本软银(Softbank)收购了ARM公司。

ARM是Advanced RISC Machine的缩写,是高级精简指令集机器,从这个命名上就可以看出来ARM架构最鲜明的特点,它是一个精简指令集架构,采用该架构的处理器一般具有低功耗的优势。

截止到2020年,ARM一共推出了8个版本的架构,分别是ARMv1~ARMv8,ARM架构从Cortex系列的核心开始,根据应用领域分成了如下3个细分配置。

  1. Cortex-A系列

面向性能密集型系统的应用处理器内核,可以运行操作系统,常见的应用有手机、PDA、平板计算机等。

  1. Cortex-R系列

面向实时应用的高性能内核,主要应用在对实时性要求高的场合,例如硬盘控制器、车载控制产品等。

  1. Cortex-M系列

面向各类嵌入式应用的微控制器内核,属于ARM的低端产品,偏向于控制方面,类似于单片机。

ARM公司本身并不生产或出售CPU,它采取的商业策略是授权处理器架构给第三方,

也就是购买了ARM公司架构授权的企业可以自行生产CPU。

根据授权的权限不同,ARM一般将授权分为如下3类。

  1. 使用层级授权

可使用封装好的ARM芯片,而不能进行任何修改。

  1. 内核层级授权

可基于购买的ARM内核进行芯片开发及设计,有一定的自主研发权。

  1. 架构层级授权

可对ARM架构进行改造,甚至对ARM指令集进行扩展或缩减。

可以用下面的例子来进行通俗性的理解:

我写了一篇文章,

我告诉甲,你可以拿去修改后使用,便是架构层级授权,

我告诉乙,你可以在你的文章中引用我的文章,便是内核级授权,

我告诉丙,你只能对我的文章进行转发,不能更改,不能添油加醋,便是使用层级授权。

一个公司若想使用ARM的内核来做自己的处理器,比如苹果三星等等,必须向ARM公司购买其架构下的不同层级授权,根据使用需要购买相应的层级授权。
    架构的授权方式有三种架构层级授权、内核层级授权(也就是所说的ip核授权)、使用层级授权。
    使用层级授权,要想使用一款处理器,得到使用层级的授权是最基本的,这就意味着你只能拿别人提供的定义好的ip来嵌入在你的设计中,不能更改人家的ip,也不能借助人家的ip创造自己的基于该ip的封装产品;
    内核层级授权,是指可以以一个内核为基础然后在加上自己的外设,比如USART GPIO SPI ADC等等,最后形成了自己的MCU,这些很多,比如三星。
    架构层级授权,是指可以对ARM架构进行大幅度改造,甚至可以对ARM指令集进行扩展或缩减,苹果就是一个很好的例子,在使用ARMv7-A架构基础上,扩展出了自己的苹果swift架构;

因此,如果华为分别拿到架构授权和ip核授权,那么意味着它可以在ARM指令集基础上根据需要创建出自己的内核架构,并可添加各种片内外设比如通信接口、显示器控制接口、GPIO等等,从而生产出自己的“处理器芯片”。

五、监控工具与测试工具

1、top

top命令显示实际进程的运行情况。在默认情况下,它显示服务器上占用CPU最多的任务并每5秒刷新列表一次。你也可以按 PID(数值)、age(最新的排第一)、time(累计的时间)、常驻内存或时间(自启动开始进程所占用的CPU时间)排序。你可以使用renice命令来修改进程的优先级。

2、vmstat

vmstat能提供进程、内存、分页、块I/O、traps和CPU活动相关信息。vmstat命令可以显示平均值或实际取样值。使用取样 频率和取样时间等参数启用vmstat取样模式。

注意:在取样模式中需要考虑实际数据搜集中存在误差的可能,设定较低的取样频率能减少这样的可能。

3、uptime

uptime命令可以用来查看服务器已经运行了多久和曾经登录过的用户有多少,以及服务器的平均负载值是多少。它可以显示过去1分钟、5分钟、15分钟的系统平均负载值。平均负载的最佳值是1,这意味着每个进程都可以立即执行不会错过CPU周期。负载的正常值在不同的系统中有着很大差别。在单处理器的工作站中,1或2都是可以接受的。

四、ps pstree

ps和pstree是用于系统分析的基本命令。ps有3中不同风格的命令选项,UNIX风格、BSD风格和GNU风格。这里我们只介绍UNIX风格选项。

ps 命令可以显示当前运行的进程列表。top命令也可以显示进程信息,但ps 可以提供更加详细的内容。使用相应选项可以影 响进程显示的数量。

5、free

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值