Bootstrap

2 华为鲲鹏HCIP 高阶鲲鹏代码移植23+鲲鹏应用发布18

3 高阶鲲鹏代码移植:23

4 鲲鹏应用发布:18

1 代码移植

1 应用执行过程

1 ISA指令集体系结构,instruction set architecture: ISA是软件和硬件之间接口的一个完整定义

2 程序编译过程:

从高级语言转为汇编语言
l 汇编语言是指令集的一种体现形式,是直接面向处理器的程序设计语言
l 不同的指令集对应不同的汇编语言
l 编译器将高级语言翻译为汇编语言
从汇编语言转为机器语言
l 机器语言是指令集的另外一种体现形式
l 汇编指令是机器指令便于记忆的书写格式
l 机器语言使用的是 CPU 能够识别的二进制

2 基于ARMV8的汇编语言简介:

1 ARMv8的运行模式:在ARMv8架构中,原先ARMv7架构中的Thumb指令被称为:T32

l AA rch64

在本模式下,所有地址保存在64位寄存器中,基本指令集可以使用64位寄存器来处理。AArch64状态下的指令集称为A64

l AA rch32

在本模式下,所有地址保存在32位寄存器中,基本指令集可以使用32位寄存器来处理。AArch32状态下的指令集可分为A32T32

运行模式

寄存器位数

指令集

指令长度

备注

AArch64

64

A64

32

使用定长指令

AArch32

32

A32

32

使用定长指令

T32(ARMv7中的Thumb)

32位和16

混合了16位和32位指令

1 ARMv8特权级别划分:级别最高的是EL3
l ARMv8 将特权级别分为 4 level 分别是 EL0 EL1 EL2 EL3 而每个 level 的特权不一样的,特权大小 EL0 < EL1 < EL2 < EL3
l 不同的 level 之间使用异常( exception )进行切换

2 Normal world和secure word:
l 为了保证数据的安全,在 Normal world 中运行的程序不能直接访问 Secure World 中的资源,必须要使用 SMC 指令切换到 Secure World 才可以访问。
l 如果开发者在设计应用时涉及到了安全服务时,例如加密解密等,需要关注此方面的知识。
l 通常情况下,开发者不会需要直接和 Secure World 进行交互,而是使用例如 authenticate ()这类的 Normal World 提供的高级 API 进行和 Secure World
4 ARMv8的通用寄存器:
l 每个特权级别下都有 31 个通用寄存器
l 64 位的寄存器的命名以“ x ”开头: X0-X31
l 32 位的寄存器的命名以“ w ”开头
 5 ARMv7的CPU模式:哪个中断,仅能运行在安全模式?MON

哪个中断,仅能运行在非安全级别?HYP

其他:既可以在安全模式,也可以在非安全模式

 6 ARMv8中,哪些汇编语言正确使用了MOV指令?MOV X0,X1 //将X1中的,复制到X0

6 数据处理技术:
l SISD ―― 指令部件只对一条指令处理,只控制一个操作部件操作 .
l SIMD ―― 由单一指令部件同时控制多个重复设置的处理单元,执行同一指令下不同
l 数据的操作。

2 ARMv8 A64基本指令集,正确的是:ARMv8的指令集向下兼容了ARMv7

数据处理指令
        

内存访问指令: 将内存中的数据,加载到寄存器中的指令:LDR Rt, Dt

流程控制指令

系统控制指令

 5 伪指令:

6 NEON简介:

l ARM 高级 SIMD 指令称为 NEON
l NEON 指令支持 AArch32 AArch64
l AA rch32 运行模式下的 NEON 相当于 ARMv7 中的 NEON

3 鲲鹏应用开发:

1 基于编译型语言

大部分应用可以通过重新编译即可移植到鲲鹏平台
少部分应用需要通过二次开发修改代码才能移植到鲲鹏平台    
内联SIMD intrinsic移植:现有一个X86平台的软件,软件中使用了intrinsic指令,现在客户希望在鲲鹏平台使用这个软件,应该用哪种加速库为客户做迁移:avx2Neon
    

2 基于解释型语言

1 JVM设置(3个经验+2个差异)

3个经验:

        完成一次GC后,释放70%的堆空间;

        假设老年代内存占用为X:

空间

倍数

参数

堆总大小

X3-4

XmxXms

年轻代

X1-1.5

Xmn(NewSize+MaxNewSize)

老年代

X2-3

堆和年轻代相减(Xmx-Xmn)

永久代

X1.2-1.5

PermSizeMaxPermSize

        年轻代大小,占整个堆空间的3/8

2个差异:

        差异1线程栈大小的Xss参数在ARM上默认值为2M,在X86上为1M,若线程开的太多,需要使用Xss调整线程栈的大小,防止OOM

        差异2由于ARMX86指令集的差异性,导致JDKJIT编译存在差异。可以通过设置参数ReservedCodeCacheSize调整CodeCache大小。

3 在将X86代码移植到鲲鹏920平台时,当涉及到内联SIMD,在进行gcc编译时,需要添加什么参数?-march=armv8-a+fp+simd+crypto+crc

 4 在鲲鹏架构下,以下哪条汇编指令是做or运算的?EOR Vd, Vn.,Vm

 5 在鲲鹏平台上准备C语言的开发环境,需要部署以下哪个工具:GCC

6 在鲲鹏平台上进行编译时,定义编译生成的应用程序为64位的参数:-mabi=lp64

7 在使用NEON时,定义了一个向量的格式为x_t,其中numbers_of_lanes指的是:Lane的数量

8 在鲲鹏分布式存储解决方案场景中,发现某块磁盘成了该集群的性能瓶颈,该如何解决:考虑更换磁盘

 9 在提高并行线程数的同时,还是注意尽量减少线程之间的:锁争抢

10 在相同规格的条件下,下列哪种类型的弹性云服务器实例的计算性能最强:H3

11 在用户访问web服务器时候,鲲鹏SSL加速引擎被部署在哪里?负载均衡/ELB

4 多选

1要将以上代码片段移植到鲲鹏平台时,哪些地方需要修改?

将printf("x86_64 is defined\n");修改为printf("aarch64 is defined\n"); 以及#ifdef x86_64修改为#ifdef aarch64

#include 

int main(){

#ifdef x86_64

printf("x86_64 is defined\n");

}

注意:将x86_64转换成aarch6

 2 ARMv8定义的内存屏障体系结构提供了那些功能?load/Store指令的排序流水线的排序

3 将Java开发的程序从x86移植到鲲鹏处理器,需要修改的地方有:

重新编译So库需要安装ARM版本的JDK将JVM的参数修改为适合鲲鹏处理器以获取最好的性能

4 将X86平台的代码一直到鲲鹏平台时,替换汇编指令的方法有哪些?

如果有相同功能的ARM汇编指令,则直接替换

如果没有相同功能的ARM汇编指令,则重新开发代码来替换

5  在鲲鹏平台,将变量类型为double的转化为long型,则可能的结果为:

0x7FFFFFFFFFFFFFFF0x8000000000000000

0x7FFFFFFFFFFFFFFF:鲲鹏为long变量,赋值大的正数

0x8000000000000000:鲲鹏为long变量,赋值小的负数

6 在鲲鹏平台,double值转为int,则可能的结果为:

0x7FFFFFFF0x80000000

0x7FFFFFFF

鲲鹏为int变量赋值大的正数

0x80000000

鲲鹏为int变量赋值小的负数

 7 在鲲鹏平台部署Python开发环境时,在开发环境部署的准备阶段,应该识别以下那些问题?

Python3在设计的时候没有考虑向下兼容;

确认需要使用的Python版本;

为了保持代码一致性,Python2所用的版本,在升级Python3后保持不变;

Python2已于2020年1月停止维护

8 在使用rpmbuild打包应用时,需要编辑spec文件,以下选项中,参数设置正确的是:

Licenses;

Source0;

Name;

Version

 9 ARM指令集从v7开始分了不同版本,其中,A系列(Application)针对复杂计算领域,如:智能手机、服务器

R系列(Real time):针对需要实时响应的,如:医疗设备、汽车制动

M系列(Microcontroller):针对功能、尺寸有一定要求的,如智能家居、通讯模块

 10 AVX2NEON加速库,对哪些指令进行了封装移植?

SSE;

AVX2;

AVX512

11 CloudIDE是DevCloud的云端开发环境,向开发者提供按需配置、快速获取的工作空间(包括编辑器和运行环境),以下哪些是CloudIDE的主要功能?

支持完成环境配置;

支持代码阅读和编写;

支持对接多种代码仓库;

支持代码构建、运行和调试

12 Django是一个高级的Python网络框架,可以快速开发安全和可维护的网站。以下关于Django的说法,正确的是:

Django是免费和开源的项目,有活跃繁荣的社区;

Django开源社区提供的解决方案,也全部都是免费的;

Django负责处理网站开发中复杂部分,因此软件开发人员可以专注于编写应用程序

13 dnf相比于yum的优势是什么?

dnf在同步存储库的元数据时,使用的内存较少;

dnf支持多种扩展

14 GCC(The GNU Compiler Collection)是GNU开发的编辑器套装,它支持的处理器架构种类很多,包含以下哪些处理器架构?

X86;

ARM;

ALPHA;

MIPS

15 GCC编译器能够为许多不同的机器生成代码,其支持以下哪些语言?

Java;

Matlab;

Fortran;

C/C++

 16 将java代码从X86移植到鲲鹏处理器时,需要修改的地方有:

将JVM参数,修改为适合鲲鹏处理器,以获取最好的性能;

需要安装ARM版本的JDK;

重新编译So库

17 下列选项中,哪些操作系统支持rpm软件管理工具?

Centos;

OpenEuler;

Suse;

Redhat;

Fedora

哪个不支持?Ubuntu

18 使用rpm2cpio/cpio命令,解压rpm源码包后,通常会得到以下哪些文件或源码包?

tar.gz源码包;

spec文件;

patch补丁文件

19  提供单指令、多数据、即SIMD指令的处理器可以提升一下哪些种类的应用程序的执行速率?

视频数据程序、声音数据程序、处理影响的程序

 

20 通过以下哪些方式,可以构建软件的二进制RPM包?

使用rpmbuild -ba命令从spec文件构建;

使用rpmbuild -rebuild命令从srpm重新构建;

使用rpmbuild -bb命令,从spec文件构建

21 

2 鲲鹏应用发布

1 应用发布流程介绍:

l 应用开发
p 按照需求,选择开发语言及开发环境进行开发
p 如在鲲鹏平台使用 C 语言开发一个应用
l 应用打包
p 根据开发语言及需求进行应用程序的打包
p C 语言一般使用 rpm 打包、 JAVA 使用 jar 命令打包等
l 配套文档编写
p 应用发布前对配套文档的制作,如版本说明、使用说明、功能说明等
l 应用发布
p 选择合适的途径和平台进行发布

注意:鲲鹏应用发布,需要提供完整的说明文档及源码包

2 主流语言的打包工具和方法:

C 语言
工具: rpmbulid
方法:使用 rpmbulid 命令把编写好 SPEC 文件进行构建打包
输出: rpm
JAVA
工具: Maven 工具, Jar 命令
方法:配置 pom.xml 文件,使用 mvn package 打包
输出: jar 文件
Python
工具:原生库 distutils ,扩展库 setuptools
方法:使用库编写打包脚本,使用命令打包
输出: tar.gz 文件

2.1 在基于编译型语言的鲲鹏应用发布流程中,编译阶段最关注的是:编译后的二进制文件是否成功运行

3 RPM:

1 RPM

RPM Redhat Package Manager )是 openEuler Redhat CentOS Fedora Linux 操作系统中的 软件包管理器。
RPM 所涉命令集:
rpm :用来手动安装、卸载、查询、升级 rpm
rpmbuild :用来把源码编译成 RPM 包(构建rpm包
rpmdevtool :用来创建 rpmbuild 目录、 SPEC 文件等
RPM 具备以下优点:
内含编译程序,免编译。
预先检查系统版本,可避免文件被错误安装。
提供软件版本资讯,软件名称软件用途等相关信息,便于了解软件。
使用数据库记录 RPM 文件的相关参数,便于升级、移除、查询与验证。                                   

2 RPM命令集

命令格式
rpm [OPTION…]
部分参数说明
- ivh                            // 安装并显示安装进度和详细信息
- qa                             // 列出已安装在本机上的应用
-Va                             // 列出本机上可能被修改过的应用
-e                              // 卸载应用

3 rpmbuild参数命令:

命令格式
rpmbuild [OPTION…]
部分参数说明
-bp                            // 只作准备 (解压与打补丁)
- bc                             // 准备并编译
-bi                             // 编译并安装
-bl                             // 检验文件是否齐全
- ba                             // 编译后生成* .rpm src.rpm
-bb                            // 编译后生成* .rpm
-bs                            // 只生成* . src.rpm

4 rpmbuild目录介绍

rpmbuild 目录是可以由命令 rpmdev-setuptree 自动生成
Rpmbuild 目录的具体路径及用途 如下:

路径

宏代码

名称

用途

~/rpmbuild/SPECS

%_specdir

Spec 文件目录

保存 RPM 包配置(.spec文件

~/rpmbuild/SOURCES

%_sourcedir

源代码目录

保存源码包(如 .tar 包)和所有 patch 补丁

~/rpmbuild/BUILD

%_builddir

构建目录

源码包被解压至此,并在该目录的子目录完成编译

~/rpmbuild/BUILDROOT

%_buildrootdir

最终安装目录

保存 %install 阶段安装的文件

~/rpmbuild/RPMS

%_rpmdir

标准 RPM 包目录

生成/保存二进制 RPM

~/rpmbuild/SRPMS

%_srcrpmdir

源代码 RPM 包目录 

生成/保存源码 RPM (SRPM)

5 rpm应用制作流程

1 准备测试代码

2 创建rpmbuild目录:

rpmdev-setuptree

3 将测试代码移动到rpmbuild目录

cd /root
mv mysql-boost-8.0.17.tar.gz /root/rpmbuild/SOURCES/
mv 0000-mysql-add-fstack-protector-strong.patch /root/rpmbuild/SOURCES/

4 制作SPEC,并修改

cd /root/rpmbuild/SPECS/
rpmdev-newspec mysql
cd /root/rpmbuild/SPECS
vim  mysql.spec 

5 rpm打包

使用命令rpmbuild进行rpm包的创建

- ba 参数表示创建可执行应用的同时,生成 rpm 的源码包
- nodebuginfo 表示生成的包不可以使用 gdb 调试
rpmbuild -ba mysql.spec

rpm安装生成的应用:

rpm -ivh /root/rpmbuild/RPMS/aarch64/hello-1.0-1.aarch64.rpm 

6 测试

6 在rpmbuild的SPEC目录下,SPEC配置文件中,用于将软件构建成机器代码(对于编译语言)、或者字节码的(对于解释型语言)的命令是哪个?%build

 7 在rpmbuild的SPEC目录下,spec配置文件中的哪个参数,用来记录软件包在不同版本version或内部release版本之间的变更?%changelog

4 Maven

0 Jar文件制作

JAVA 开发的应用在发布前通常会打包一个 JAR 文件, JAR Java ARchive )是将一系列文件(包含库、依赖文件等)合并到单个压缩文件里。
手动制作:早期使用jar 命令制作 JAR 文件,所有的编译、测试、代码生成、打包等工作需要手动重复执行,效率较低,出错的机率较高
自动生成:借助Maven 等工具,自动进行软件包生命周期的管理,从而提高工作效率,降低出错的机率
程序开发的过程当中,构建工程,编写代码, 测试代码, 打包,部署,上线等每天都是重复工作。在传统过当中需要手工的去操作, 那么效率是低效的。
自动化构建工具 Maven 一键全自动完成 构建工程,编写代码, 测试代码, 打包,部署,上线等工作,那么效率是高效的。

1 Maven介绍

1 Maven Apache 下的一个纯 Java 开发的开源项目,基于 项目对象模型 (缩写: POM ),可以对 Java 项目进行构建,依赖管理。
Maven 官网链接: http://Maven.apache.org/
Maven 下载链接: http://Maven.apache.org/download.cgi
Maven 安装指导: http://Maven.apache.org/install.html

2 POM文件介绍:

Maven工程中pom文件的作用:确定项目依赖的文件,提供快速研发

Pom project object model )是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等。以下为 pom 文件的部分内容:
modelVerion :模型版本,目前是 4.0.0
groupId :组织 id ,一般是一个公司域名的倒写
artifactId :项目名称,自定义生成
version :项目的版本号,如果项目仍然处在开发阶段,通常在版本中带有 -SNAPSHOT
groupId artifactId version 组成了坐标,是一个项目的唯一标识

3 Maven仓库

 4 鲲鹏Maven仓库:

鲲鹏 Maven 仓库提供了适配鲲鹏平台的 so 库,开发者可以直接调用,无需进行重新编译
鲲鹏 Maven 仓库链接: https://mirrors.huaweicloud.com/kunpeng/Maven/
在鲲鹏应用开发时,建议将远程仓库配置为优先搜索鲲鹏 Maven 仓库
修改 settings.x ml 文件
profiles 便签下增加鲲鹏 Maven 仓库的信息,包括 id url
将鲲鹏 Maven 仓库的信息放在第一位,使其可以被优先使用

5 Maven生命周期

6  Maven打包:开发、打包、安装

 7 鲲鹏应用构建流程

8 Maven构建工程骨架:mvn archetype: generate

9 在Maven工程的目录结构中,Resources的功能是什么?存放配置文件,例如xml类型等。

5 发布后期维护,描述正确的是:对生命周期进行管理,到期即下线所有版本

X 多选

1 Maven全局配置文件settings.xml文件与.m2中的配置文件settings.xml的区别是什么?

2个settings文件同时存在;

Maven全局settings.xml文件,对系统内所有用户生效;

.m2中settings文件只对当前用户生效

2 rpmbuild的SPEC文件的功能是什么?

说明软件包的属性;

说明软件包怎样被配置、安装哪些文件以及被安装到哪里;

声明软件的许可证

3 rpm软件管理工具的功能包括哪些?

查询和验证;

安装;

卸载;

升级

4 rpm软件管理工具的优势有哪些?

提供软件版本资讯、软件名称和软件用途等相关信息;

使用数据库记录rpm文件的相关参数,便于升级、移除、查询与验证;

该工具包含了编译程序,免编译;

预先检查系统版本,避免错误安装

5 rpm软件管理工具如何区分源码文件与二进制bin文件?

软件包的后缀是否为.rpm;

软件包的后缀是否为.tar.gz.zip

6 Java常用的开发配套工具有:

ant;

gradle;

maven

7 代码归一实现的方式有3个:

代码段编译宏控制;

编译文件Makefile控制;

运行态自动适配

错误的:添加自动识别硬件的代码进行自动控制

8 对MySQL内存优化的参数有哪些?

innodb_buffer_pool_size;

innodb_buffer_pool_instance 

9 基于变异性语言(C/C++)的鲲鹏应用程序发布时,下列哪些环节属于该流程?

将源代码编译成二进制文件;

将源代码打包成rpm包

不属于该流程的是:

源代码打包成二进制需要对平台进行编译,但最终的结果不会影响我们发布在鲲鹏平台下执行程序;

将源码打包生成rpm包的同时,注意版本号。

;