精华内容
下载资源
问答
  • 汇编语言笔记-ARM架构基本寄存器
    千次阅读
    2022-02-11 16:50:06

    寄存器组

           Cortex-M3和Cortex-M4处理器(ARM架构)用于数据处理与控制的寄存器组中有16个寄存器,其中13个(R0 ~ R12)为通用目的寄存器,另外三个具有特殊用途:
    在这里插入图片描述

    1.R0 ~ R12

           寄存器R0 ~ R12为通用目的寄存器,其中前8个(R0 ~ R7)也被称作低寄存器,由于指令中可用的空间有限,许多16位指令只能访问低寄存器。而其它寄存器(R8 ~ R12)被称为高寄存器,可用于32位指令和部分16位指令,如MOV。

    R0 ~ R12的初始值是未定义的。

    2.R13

           R13为栈指针(SP),设置该指针的值后可通过PUSH和POP指令访问栈。

           物理上存在两个栈指针:
           1.主栈指针(MSP,有些ARM文献也称其为SP_main)为默认的栈指针,在复位后或处理器处于处理模式时该指针被处理器选择使用。
           2.进程栈指针(PSP,有些ARM文献也称其为SP_ process),只用于线程模式。

           栈指针的选择由特殊寄存器CONTROL决定。对于一般的程序,这两个寄存器(即MSP和PSP两个寄存器)只有一个可见。
           MSP和PSP都是32位寄存器,但最低两位固定为0。对于 ARM Cortex-M处理器,PUSH和POP指令总是32位的,栈操作的地址也必须对齐到32位的字边界上。

    大多情况下,若不需要使用嵌入式OS则没必要使用PSP。许多简单的应用可以完全依赖MSP。一般在用到嵌入式OS时才会使用PSP,此时OS内核同应用任务的栈是相互独立的。PSP的初始值未定义,而MSP的初始值则需要在复位流程中从存储器的第一个字中取出。

    3.R14

           R14为链接寄存器(LR),用于保存函数或子程序调用时返回地址。
           在函数或子程序结束时,程序将LR的数值加载至程序计数器(PC)中返回调用程序处并继续执行(也就是跳转回上层函数)。
           当执行了函数或子程序调用后,LR的数值会自动更新。若某函数调用另外一个函数或子程序,则需要将LR的数值保存在栈中,否则,函数执行后,LR的当前值会丢失(函数嵌套必须将对应的上层函数地址保存在栈中)。
           在异常处理期间,LR自动更新为特殊的EXC_RETURN(异常返回)数值,以在异常处理结束时触发异常返回。

    4.R15

           R15为程序计数器(PC),可读写寄存器,读操作返回当前指令地址加4(由于设计的流水线特性及同ARM7TDMI处理器兼容的需要)。写操作(例如,使用数据传输/处理指令)产生程序跳转。
           由于指令必须对齐到长度(半字或字),PC的最低位(LSB)为0。但使用部分跳转/读存储器指令更新PC时,需要将PC值的LSB置1表示 Thumb状态,否则就会由于试图使用不支持的ARM指令(如ARM7TDMI中的32位ARM指令)而触发错误异常。高级编程语言(包括C和C+)编译器会自动将跳转目标的LSB置位。
           多数情况下,跳转和调用由专门的指令实现。访问位于程序存储器中的字符数据时,PC的数值非常有用,因此存储器读操作经常将PC作为基地址寄存器,并通过指令中的立即数生成偏移地址。

    多数汇编工访问寄存器组中的寄存器时可以使用多种名称。一些汇编工具如ARM汇编(被DS5 Professional和 Keil MDK-ARM支持)可以使用大写、小写或者大小写混合,如下表所示:
    在这里插入图片描述

    特殊寄存器

           特殊寄存器未经过存储器映射,可以使用MSR和MRS等特殊寄存器访问指令来进行访问:

    MRS <reg>,<special_reg>    ;将特殊寄存器读入寄存器
    MSR <special_reg>,<reg>    ;写入特殊寄存器
    

           CMSIS-Core(为Cortex-M处理器核和外设定义的应用程序接口API)提供了几个用于访问特殊寄存器的函数。

    不要混淆特殊寄存器和其他微控制器架构中的“特殊功能寄存器(SFR)”,SFR一般指的是用于I/O控制的寄存器

    程序状态寄存器(xPSR)

           程序状态寄存器包括以下三个状态寄存器:

    • 应用PSR(APSR)
    • 执行PSR(EPSR)
    • 中断PSR(IPSR)

           三个寄存器各个功能位为:
    在这里插入图片描述
           各个位的作用如下表所示:
    在这里插入图片描述

    注意,APSR和EPSR的一些位域在ARMv6-M架构(如 Cortex-M0)中不可用,且与ARM7TDMI等经典ARM处理器之间存在很大的差异。

           这三个寄存器可以通过一个组合寄存器访问,该寄存器在有些文献中被称作xPSR,ARM汇编器访问xPSR时通过“PSR”访问:

    MRS R0, PSR   ;读组合程序状态字
    MSR PSR, R0   ;写组合程序状态字
    

    注意,此时组合寄存器为三个寄存器的有效位叠合,如下图所示:
    在这里插入图片描述

           同时,也可以单独访问某个PSR:

    MRS R0, APSR   ;将标志状态读入R0
    MRS R0, IPSR   ;读取异常/中断状态
    MSR APSR, R0   ;写标志状态
    

    无法使用MRS(读出为0)或MSR直接访问EPSR。
    IPSR为只读寄存器。

    中断/异常屏蔽寄存器

    名 字功能描述
    PRIMASK1位宽寄存器。置位后关闭NMI(不可屏蔽中断和HardFault外的所有可屏蔽异常/中断。
    FAULTMASK1位宽寄存器。置位后只有NMI可以响应(相比于PRIMASK,可屏蔽的中断/异常多了HardFault)。
    BASEPRI根据优先级屏蔽中断/异常,该寄存器最多有9位(由设计实现的优先级位数决定)。该寄存器定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关(注意:优先级号越大,优先级越低);若设置成0,则不关断任何中断。

    注意:FAULTMASK和BASEPRI寄存器在ARMv6-M中不存在(如Cortex-M0)。

    只有特权状态才可以操作三个寄存器(非特权状态下的写操作会被忽略,读操作返回0)。三个寄存器默认值为0,即屏蔽(禁止异常/中断)不起作用。

           使用MRS/MSR指令访问这三个寄存器,比如:

      MRS    R0, BASEPRI            ;将BASEPRI寄存器的值写入R0
      MSR    BASEPRI, R0            ;将R0的值写入BASEPRI寄存器
    

           可通过CSP(修改处理器状态)指令快速设置中断/异常的开关:

      CPSID    I    ;PRIMASK=1,关中断
      CPSIE    I    ;PRIMASK=0,开中断
      CPSID    F    ;FAULTMASK=1,关异常    
      CPSIE    F    ;FAULTMASK=0,开异常
    

    CONTROL寄存器

           Cortex-M3、M4及的CONTROL寄存器如下,其中:

    • nPRIV在Cortex-M0中不存在,在 Cortex-M0+中可选
    • 具有浮点单元的Cortex-M4处理器的CONTROL寄存器中有1位表示当前是否使用浮点单元。
      在这里插入图片描述

           各个位的解释如下:

    描述
    nPRIV用于定义线程模式中的特权等级:
    0(默认):处于线程模式模式中的特权等级
    1:处于线程模式模式中的非特权等级
    SPSEL用于定义栈指针的选择:
    0(默认):线程模式使用主栈指针(MSP)
    1:线程模式使用进程栈指针
    处理模式下该位始终为0,且无法写入
    FPCA只存在于具有浮点单元的Cortex-M4中。异常处理机制通过该位确定异常产生时浮点单元相应寄存器是否需要保存。
    0:当前的上下文不使用浮点指令
    1:当前的上下文使用浮点指令(此时产生异常自动保存相应浮点寄存器)。

    该寄存器复位后默认为0

    只有特权状态才能修改(写操作)CONTROI寄存器。(读操作则不需要特权状态)

           同样的,使用MRS/MSR指令访问该寄存器:

      MRS    R0, CONTROL            ;将CONTROL寄存器的值写入R0
      MSR    CONTROL, R0            ;将R0的值写入CONTROL寄存器
    

    浮点寄存器

    1.S0 ~ S31和D0 ~ D15

           S0 ~ S31(S)都为32位寄存器,可通过浮点指令或利用符号D0 ~ D15(D代表双字/双精度)成对访问。
           例如,S0和S1成对组成D0,而S2和S3则成对组成D1。

    浮点状态和控制寄存器(FPSCR)

           FPSCR寄存器用于定义浮点运算动作并提供浮点运算结果的状态信息,其位域及各个位的描述如下所示:
    在这里插入图片描述

    描述
    N负标志(由浮点比较运算更新)
    Z零标志(由浮点比较运算更新)
    C进位/借位标志(由浮点比较运算更新)
    V溢出标志(由浮点比较运算更新)
    AHP交替半精度控制位:
    0:IEEE半精度格式(默认)
    1:交替半精度格式
    DN默认NaN(非数值)模式控制位:
    0:NaN操作数会变为浮点运算的输出(默认)
    1:任何涉及一个或多个NaN的运算会返回默认的NaN
    FZ清零模式控制位:
    0:清零模式禁止(默认)(符合IEE754标准)
    1:清零模式使能
    RMode舍入模式控制位,表示的舍入模式基本上适用于所有的浮点指令:
    00:最近舍入(RN)模式(默认)
    01:正无穷舍入(RP)模式
    10:负无穷舍入(RM)模式
    11:向零舍入(RZ)模式
    IDC输入非正常累积异常位(结果未在正常数值范围内)
    IXC不精确的累积异常位
    UFC下溢累积异常位
    OFC溢出累积异常位
    DZC被零除累积异常位
    IOC非法操作累积异常位

    上述的6个异常位在浮点异常产生时置位,写0则将其清除

    浮点单元控制寄存器(经存储器映射)

           暂略…

    注意

           ARM架构具有两种状态:ARM状态和Thumb状态,其中Cortex-M3和M4只能使用Thumb状态,而在该状态下部分寄存器的访问是有限制的:
    在这里插入图片描述

    更多相关内容
  • 银河麒麟QEMUARM架构虚拟机,已经搭建好,测试朋友直接下载运行即可。https://qemu.weilnetz.de/w64/2020/ 下载qemu5.x D:\software\QEMU\qemu-system-aarch64.exe -m 6333 -cpu cortex-a72 -smp 2,cores=2,threads=...
  • 构建arm架构ubuntu根文件系统.pdf构建arm架构ubuntu根文件系统.pdf构建arm架构ubuntu根文件系统.pdf构建arm架构ubuntu根文件系统.pdf构建arm架构ubuntu根文件系统.pdf构建arm架构ubuntu根文件系统.pdf构建arm架构...
  • ARM架构的linux测试工具集合,unixbench等
  • x86架构转arm架构

    2018-08-02 20:27:24
    附上使用教程,配上资源链接。实现Genymotion安装arm架构的app。注意事项详见:https://blog.csdn.net/wangyanit/article/details/81366900
  • 1.arm架构下的openjdk8 2.在arm下的麒麟V4系统下测试正常使用
  • 基于ARM架构的OpenJDK1.8

    2020-05-04 21:13:49
    鲲鹏云不支持OracleJDK,只支持OpenJDK与HuaweiJDK,以上是基于ARM架构的OpenJDK,亲测有效。
  • tensorflow2.3.1版本,arm架构,适合jetson nano的使用,支持cuda加速,编译的时候提供了gpu的支持,适配python的版本是3.6版本
  • ARM架构详解

    2021-07-07 12:42:56
    前不久ARM正式宣布推出新款ARM8架构的 Cortex-A50处理器系列产品,以此来扩大ARM在高性能与低功耗领域的领先地位,进一步抢占移动终端市场份额Cortex-A50是继 Cortex-A15之后的又重量级产品,将会直接影响到主流PC...
  • 1、ARM Architecture Reference Manual.pdf-------------------比较旧的ARM芯片的参考手册,如S3C2440等 2、ARM7TDMI Technical Reference Manual.pdf-------------ARM7TDMI内核芯片参考手册 3、ARM7TDMI-S ...
  • RaspberryPi树莓派处理器使用的是ARM架构,而一般电脑则为x86或x64架构,均不能适用,故只能在系统中重新编译安装RXTX源码,此so文件为在arm架构的树莓派编译制作的文件,直接放在jre目录即可运行
  • ARM 架构是构建每个 ARM 处理器的基础。ARM 架构随着时间的推移不断发展,其中包含的架构功能可满足不断增长的新功能、高性能需求以及新兴市场的需要。有关最新公布版本的信息,请参阅 ARMv8 架构。  ARM ...
  • FT2000+kylinOS4.0.2
  • Jmeter的ServerAgent在Arm架构的Linux上所需的so库:libsigar-aarch64-linux.so
  • ceph14.2.0 安装包,适用于arm架构下麒麟系统,其他系统未做测试,系统版本不一样可能会有部分依赖包缺失,可根据提示下载更新
  • UOS服务器版ARM架构openjdk-8-jdk离线安装包及依赖
  • arm架构下的mysql-connector库文件,版本:mysql-connector-c-6.0.2。库文件有libmysqlclient_r.so,libmysqlclient.so,libmysql.so,libmysql.so.16
  • AMD近日宣布即将推出AMD Opteron A1100系列开发套件,它配备了AMD首款基于64位ARM架构的处理器,代号为“西雅图”.AMD是第一家为软件开发人员和集成商提供标准ARM Cortex A57服务器平台的公司。软、硬件开发人员以及...
  • 亲自编译的arm架构下的boost库文件,版本1.59。经测试可用。
  • 方便大家下载JDK 1.8,官网下载可能会稍微慢点,直接从此处下载,同事说要有分享精神,给大家提供方便,其乐无穷。
  • ARM架构.docx

    2019-09-11 09:55:02
    很多时候我们都会对M0,M0+,M3,M4,M7,arm7,arm9,CORTEX-A系列,或者说AVR,51,PIC等,一头雾水,只知道是架构,不知道具体是什么,有哪些不同?
  • 介绍基于DSP+ARM架构协议转换器的系统组成及其工作原理,给出了DSP通过EMIF接口与FPGA无缝连接的接口实现,DSP通过HPI接口与ARM高速接口的实现,以及基于ARM的高速以太网接口。简要介绍了基于嵌入式操作系统uClinux...
  • 基于ARM架构服务器的机会与挑战.
  • 超详细的ARM架构适配介绍

    千次阅读 2022-01-22 18:07:17
    本文主要介绍云联壹云平台如何适配ARM,并运行在ARM CPU架构的机器上。 背景介绍 1、平台服务运行架构 云联壹云平台采用容器化,分布式的架构运行在 Kubernetes(K8s)之上。下面是平台服务运行的架构图: ...

    本文主要介绍云联壹云平台如何适配ARM,并运行在ARM CPU架构的机器上。

    背景介绍

    1、平台服务运行架构

    云联壹云平台采用容器化,分布式的架构运行在 Kubernetes(K8s)之上。下面是平台服务运行的架构图:

    在多个节点之上,我们会构建Kubernetes的集群 ,它是一个容器管理的平台。

    在Kubernetes的平台之上,后端服务都是容器化的,是以容器的方式去分布式运行。

    通过K8s去做调度的管理,然后将服务自动地打散到多个节点上运行,总结两点是服务容器化,并依靠K8s来提供容器分布式运行的环境。

    另外,底层的节点是有类型的,控制层面的服务运行在控制节点,平台内置了一个私有云,提供了完整的私有云功能。

    若要使用私用云这个功能,则还需要一些计算节点,计算节点上会跑虚拟化相关的软件,提供私有云虚拟化的功能,总结来说就是计算节点运行私有云的虚拟机。

    2、CPU架构简介

    大家熟悉的服务器或者台式机都是X86架构的CPU,X86架构的CPU特点是性能高,并且软件的兼容性很好。

    大家平常工作中使用的大部分是英特尔等提供的X86架构的CPU,对于英特尔和AMD大家都不陌生,这两家厂商专门生产X86架构CPU。

    另外X86 64位这种架构的CPU存在别名,例如x86_64或者amd64都代表X86架构的64位CPU。

    与X86不同的是还有另一种称为ARM的架构,这是本文的主题,那么ARM架构的CPU和X86架构的CPU相比有何不同?

    它的制造成本更低,ARM架构的芯片的功耗也很低,代表性的厂商和使用者是苹果和华为。

    苹果将生产的ARM芯片用到笔记本或IMAC上,ARM架构的CPU越来越普及。

    国内的华为会生产基于ARM架构的服务器,64位ARM架构CPU也有别名,例如arm64、aarch64,这两种叫法表达同一个意思。

    3、为什么适配ARM

    因为ARM的CPU普及是大环境下的发展趋势,例如在国际上,苹果将ARM架构的CPU投入到笔记本和台式机上,在国产化方面,国内有鲲鹏和飞腾CPU,国产的基于ARM架构的服务器,现在市场上主流的是鲲鹏和飞腾。 在国产化上,使用ARM架构也是一个趋势。

    另外是适配了ARM架构能够提升产品的竞争力,竞争力体现在能够支持管理基于ARM64位和X86_64架构的虚拟化混合部署。

    这种混合部署的意思是可以同时把服务运行在ARM和X86的服务器上,同时运行各自的虚拟化,可以通过我们平台统一部署和管理。

    如何适配ARM64?

    1、需要解决的关键问题

    第一个方面是怎样把服务运行在64位的ARM架构上?

    还有一方面是因为我们内置了一个私有云,上层的私有云业务如何支持64位的ARM架构?

    通过架构图可以了解到服务是容器化运行在K8s之上的,再由K8s帮我们将服务分布式地运行在各个节点上,所以第一步是要部署异构CPU架构的K8s集群,异构CPU架构的意思是K8s集群要运行在X86和ARM架构的机器上。

    具体而言就是要选择一个支持ARM架构的Linux的发行版。

    K8s节点上的操作系统是Linux,首先要选择支持ARM架构的Linux操作系统,操作系统同时能够安装K8s必要的软件(比如docker-ce、kubelet等)

    当我们把K8s集群给部署起来之后,就要将不同架构的容器镜像统一制作出来。

    统一容器镜像的意思是一个容器镜像中要包含X86和ARM架构,相当于同一个镜像名称中有两种架构的镜像。

    第二个大的方面是上层私有云业务怎样支持ARM64。

    主要是分为两个问题,第一个问题是要支持ARM的虚拟机镜像,同时上层的私有云业务能够标记宿主机,宿主机就是运行虚拟机的服务器。

    要能够标记这种宿主机是什么架构,同时要在这个宿主机上运行ARM的虚拟化软件。

    平台使用的虚拟化软件基于qemu/kvm,网络方面依赖openvswitch组件,要求这些组件也要能够在ARM架构上运行。

    这就是要介绍的一些关键问题,解决好这些关键问题,不管是底层的业务还是上层的私有云业务,都能在ARM上运行。

    2、Linux发行版选择

    我们选择的发行版是Debian 10(开源)和统信UOS(国产系统)。

    选择这两个发行版的第一个原因是客户业务上要求在ARM64服务器上运行“统信UOS”。

    要适配的话也是首先适配国产统信UOS,在适配过程中,UOS中的内核和打包工具与Debian基本一致。

    适配UOS之后,发现其工作基本相同,所以又选择了Debian 10(开源)进行适配。

    如此无论是对于开源用户还是其他客户,如果不选择UOS,也可以选择Debian 10的发型版运行此平台,Debian系列对ARM64位的支持很好,

    Debian发行版的官方软件仓库中已经制作好了很多ARM64的包,如果要安装docker和K8s的软件包,Debian中已经做好,直接下载安装即可。

    为什么不在ARM架构上面再选择CentOS7发行版?

    原因在于CentOS7官方即将停止维护,所以选择了Debian系列的发行版。

    3、统信UOS适配认证

    对统信UOS适配过后,经过其官方测试,为我们颁发了认证证书。

    4、统一软件依赖—包管理工具

    选择好发行版后?怎样统一安装这些软件?

    我们能够使用不同发行版的包管理工具去安装相同的软件,例如在X86的CentOS上安装docker和K8s这些包时调用yum,在Debian上调用apt install 等同样的包名即可。

    上游的软件仓库中已经把包做好,只需直接安装,软件直接下载即可使用。

    在底层软件方面,ARM和X86的管理,只要发行版是主流的,验证Debian和X86的包没有区别,已经将底层的包安装部署好。

    5、部署kubernetes集群

    另外一个话题是部署kubernetes集群,如何在ARM上部署K8s集群?

    首先,我们写了名称为ocboot的部署工具,它的底层原理是调用ansible实现部署ARM64+X86_64的多节点Kubernetes,这个截图的意思是通过这个工具部署过后的混布的就是异构的K8s集群的节点的资源。

    从截图中可以发现,第一个节点是centos-x86-64,发行版名称是centos7,内核是3.10,K8s会通过打标签的方式标记这个节点,它是amd64。

    amd64代表它是X86架构的一个节点,另外一个节点是uos-arm64,它的发行版是uos,内核是4.19.0-arm64的内核。K8s会通过打标签标记它是ARM64的一个节点,这就代表是一个同时基于X86和ARM64的节点构建的K8s集群。

    使用K8s集群的好处是K8s 集群提供了不同CPU架构节点的统一管理,通过一个API能够把所有架构的节点拿到,能够基于这些节点提供容器服务的运行。

    6、服务统一镜像运行

    部署好K8s集群之后如何运行云联壹云的服务?

    例如K8s中有daemonset的资源,这种资源表示在每一个K8s节点上都会运行pod容器。

    它要求在这个资源中写好服务容器镜像的地址,即红框中所标记的。

    只要按照这样的格式写,写好之后创建到k8s集群中,K8s就会将提供的镜像以容器化的方式运行到各个节点上。

    从图中可以了解到,在centos X86的节点上和UOS ARM架构的节点上都同时运行host的服务,这是如何做到的呢?

    这就要求统一服务的进项,要在host:v3.6.10的镜像中包含两种架构的镜像格式,它的底层同时将X86和ARM的格式捆绑到一起,在实际运行过程中,在不同的架构的节点上,docker会根据当前节点的架构拉取镜像中不同架构的格式的镜像运行。

    7、私有云业务如何支持ARM64?

    • 宿主机列表

    在运行虚拟机的宿主机上去标记宿主机的架构类别,云平台的前端界面可以看到,给宿主机列表上面加了CPU架构的属性,ARM架构服务器的宿主机,会给它一个称为aarch64的CPU架构来标记,X86则会标记x86_64的CPU架构属性 。

    若要运行虚拟机,则需要先提供虚拟机的镜像,我们在虚拟机的镜像中也使用了CPU架构的属性来标记虚拟机镜像是X86架构还是ARM 64位的架构。

    提供宿主机和虚拟镜像过后,即可创建虚拟机,在创建虚拟机的表单中,会让用户去选择是要创建ARM架构的虚拟机还是X86架构的虚拟机。

    创建好虚拟机过后,平台负责将这些虚拟机根据所提供的CPU架构调入到不同架构的宿主机上,这是一个在平台同时创建的X86和ARM的虚拟机列表界面。

    在此列表中通过CPU架构的字段了解虚拟机的架构类型,这就是在私有云这个业务做的改造并支持ARM64位架构。

    技术细节

    如何制作统一的容器镜像(支持X86_64和ARM64)?

    • docker buildx方案

    docker原生支持的多架构镜像制作方案

    点击进入官方介绍

    • 使用交叉编译然后打包

    分别编译打包出x86_64和arm64的容器镜像,然后捆绑到一起。

    1、统一容器镜像—docker buildx

    • 编写适用buildx的 Dockerfile

    docker通过读取file中的语句,制作出镜像,Dockerfile先基于一个称做golang:alpine的镜像,把它作为一个build容器。

    同时,其中会传两个参数,分别是TARGETPLATFORM 和BUILDPLATFORM。

    TARGETPLATFORM的意思是制作出的镜像架构,BUILDPLATFORM 是当前制作镜像机器的架构 ,这里RUN的命令会读取这两个环境变量,然后将他们的值打到名称为log的文件中。

    第二步,FROM alpine 的语句是找到alpine这个镜像,基于这个容器镜像将build容器中的log文件拷贝出来。

    使用buildx 同时制作x86_64和arm64架构的镜像。

    -t的意思是build出的镜像的名称,push代表要push到docker镜像仓库中,platform参数代表制作出来的镜像同时代表两个架构,分别是x86 64位架构和arm64位架构。

    运行此命令,docker buildx就会基于dockerfile的步骤,同时拉取ARM架构和X86架构的基础镜像。

    基于基础镜像运行里面相同的语句,例如红色标记的地方,它同时运行两个架构的指令,相当于同时拉取了amd64和arm64的alpine 镜像。

    去build时,同一条build语句也在amd64和arm64这两个架构上运行。

    通过build出的结果即可发现RUN的这个命令,是在X86架构的机器上制作的镜像build出的结果,例如第一条是build出了arm64的镜像,第二条是build出X86 64位的镜像。

    build完镜像过后,把它push到镜像仓库中,即可通过docker manifest 这个命令去查询这个镜像里面的一些元数据,查看刚才制作的镜像,manifest 中有两种格式,第一种格式是amd64,表示X86_64架构,第二种格式是ARM64,是能够运行在ARM上的镜像,这些都是buildx做好的,我们只需要写dockerfile。

    它默认帮我们制作出来一个多架构的容器镜像。

    buildx 如何在 x86_64的机器上制作arm64的镜像?

    通过binfmt_misc模拟arm64硬件的用户空间,然后调用qemu的用户态模式编译程序。

    最终结果是调用buildx的命令过后,编译进程后,会运行qemu-aarch64 工具,相当于模拟出arm64的硬件环境,然后调用ARM的工具做编译,截图中,后端服务都是用Golang编写,都需要做编译。

    2、统一容器镜像-交叉编译

    交叉编译:直接在x86_64开发机上编译arm64二进制。

    图中的Go代码,其中写了main的函数,在X86的机器上直接编译,调go build工具,然后把它编译成一个叫做t_x86_64的二进制可执行文件。

    然后在操作系统上调用file去看可执行文件的内容,通过信息可知这是一个64位的可执行文件,并且是x86-64架构。

    Go中的交叉变异很简单,指定GOARCH的环境变量,然后把它设置为arm64,然后再运行相同的go  build的命令,即可使用交叉编译,编译出ARM可执行的文件。 

    编译出来之后,再去看t_arm64的二进制文件,即可发现它也是64位的执行文件,但其架构为ARM,此即为交叉编译的简单的示例。 相当于在X86的开发机上使用交叉编译工具编译出ARM执行文件。

    3、如何将不同架构镜像打包

    将交叉编译后的x86_64和arm64容器镜像组合到一起。

    例如已经有名称为service:v1_x86_64的容器镜像和service:v1_arm64的镜像,如何将其组合为service:v1 = service:v1_x86_64 + service:v1_arm64 的容器镜像?

    首先创建 service:v1 的 manifest 镜像,然后将x86_64的镜像和arm64的镜像捆绑到一起,然后调用docker manifest标记镜像 service:v1_arm64 的架构为 arm64 ,标记镜像 service:v1_x86_64 的架构为 amd64 ,再调用docker push将service:v1 镜像上传到镜像仓库即可,如此制作出来的一个镜像中即可包含两个架构。

    4、buildx与交叉编译打包对比

    如果使用buildx+binfmt_misc的方式,速度很慢,在本地x86机器上运行,复杂度很低。

    如有ARM服务器,可以通知buildx ssh到远程的ARM机器,会把编译arm的部分交给远端的ARM机器,速度很快,环境要求为本地x86+远端arm64机器,因为一般不会给每个开发人员提供ARM服务器,所以未采用此种方式。

    最后是交叉编译+manifest打包的方式,速度很快,因为编译器中做了交叉编译的优化,能够直接编译出ARM架构的二进制,此种方式只依赖本地的开发环境,此种方式复杂度较高。

    现阶段使用的方式是同时使用buildx + binfmt_misc和交叉编译 + manifest 打包的方式。

    前端不需要编译的服务:使用buildx + binfmt_misc

    后端编译型的服务:使用交叉编译然后打包

    5、私有云管理—虚拟化软件

    私有云上层业务支持X86和ARM虚拟化混合管理,要做混布支持,首先要让虚拟化软件能够运行在ARM架构上,主要运行虚拟机的软件是通过名称为qemu的虚拟化软件工具,通过交叉编译的方式运行在ARM架构上。

    在做编译之前,只需要配置好目标的架构是aarch64即可。

    qemu在实际生产使用中要结合KVM虚拟化加速工具,debian 10 4.19.0 aarch64 内核原生支持。

    openvswitch 网络虚拟交换机可以直接在debian 中安装使用。

    6、私有云管理—业务支持

    例如在宿主机的资源中加上属性,标记宿主机是ARM架构还是X86架构,还有在平台虚拟机镜像中加上架构的属性,同时调度器的服务也要做改造,保证用户创建一台ARM架构的虚拟机,能够调度到ARM的宿主机上。

    大家可以根据图中列出的 PR详细地址了解业务支持详情。

    GitHub:GitHub - yunionio/cloudpods: A cloud-native open-source unified multi-cloud and hybrid-cloud platform. 开源、云原生的多云管理及混合云融合平台

    展开全文
  • 在仅仅是裸奔的情况下,如果熟悉了ARM架构,那么我认为使用任何ARM架构的芯片和用单片机将没有区别。ARM架构之所以更复杂,当然是为了跑更快以及更好地支持片上系统,所以在某种程度上来说对片上系统不是很了解的话...
  •   ARM 架构的 MCU 用了好多年,对于 ARM 架构也或多或少的有了一些了解。之前都是遇到啥问题直接去官网找对应的手册,一直没有系统的总结一下。是时候总结一下,好进行下一步学习了! ARM 文档   在了解 ARM ...

      ARM 架构的 MCU 用了好多年,进一步对于 ARM 架构也或多或少的有了一些了解。之前都是遇到啥问题直接去官网找对应的手册,一直没有系统的总结一下。是时候总结一下,以便进行下一步学习了!

    总的来说,整个 ARM 可以分为两大部分:SoC 设计ARM 平台软件开发

    ARM 文档

      在了解 ARM 相关的各种概念之前,先来简单说一下 ARM 官方提供的文档的组织结构。其实,国外这些大公司对于文档的组织都是比较规范的,例如,ST 的 参考手册、数据手册、应用手册等等,ARM 文档也基本可以分为参考手册、用户指南。这么划分的目的就是为了让各部分更加独立。简单来说,参考手册仅介绍原理,用户指南介绍使用方法,两者相互独立。
    在这里插入图片描述

    • Arm Architecture Reference Manual :架构参考手册描述架构规范。是按照不同的架构版本分开的(如上图是 Armv8-A的架构参考手册),里面会详细介绍对应架构的细节。
    • Technical Reference Manual (TRM) :这个是针对 ARM IP 的参考手册。 描述特定于该 ARM IP 的特性。
    • Configuration and Integration Manual (CIM) :这个也是针对 ARM IP 的参考手册。描述如何将处理器集成到系统中。一般来说,这些信息只与 SoC 设计相关。仅对被授予了 IP 许可的合作方开放。

    下表显示了在不同类型的文档中的内容:
    在这里插入图片描述

    上面说的文档都属于参考手册

      ARM 的所有文档都放在专门为开发者提供了网站 Arm developer website 上,除此之外,ARM 的官方社区也是一个宝库,社区包含:博客(ARM 的设计师经常在上面分享一些文章)、论坛(里面有很多专业问题及设计师的解答)。

    架构(Architecture)

      架构(Architecture)指的是一些列的功能规范。ARM 架构 指的就是是基于 ARM 架构的处理器的功能规范,即 ARM CPU 架构。架构指定了处理器的行为方式,例如它有什么指令以及指令做什么。
    在这里插入图片描述
    可以将架构看作是硬件和软件之间的契约,描述了软件可以依赖硬件提供哪些功能。大体包含以下内容:

    条目说明
    指令集每条指令的功能;指令如何在内存中表示(它的编码)
    寄存器组有多少寄存器;寄存器的大小;寄存器的功能;寄存器的初始状态
    异常模型不同的权限级别;异常的类型;从异常中获取或返回时会发生什么
    内存模型内存访问是如何排序的;缓存是如何运作的,什么时候以及软件必须如何执行显式维护
    调试、跟踪和分析如何设置和触发断点;跟踪工具可以捕获什么信息,以什么格式捕获

      ARM 架构 可以认为就是个专有名词,是 ARM 制定的一些列功能规范的统称。至今已经有发展了很多版。最初的 ARMv1、ARMv2,后来的 ARMv6、ARMv8;最新的 ARMv9。

      每一代 ARM 架构 都有一个专门的文档(架构参考手册)来介绍该架构的具体细节。需要注意的是,架构参考手册是根据 Profile 来分开的,并不是一个统一的文档。例如,《Armv8-M Architecture Reference Manual》、《Armv8-A Architecture Reference Manual》等等。

    微架构(Micro-Architecture)

      ARM 架构不会介绍处理器是如何构建的或它是如何工作的。 处理器的构建和设计称为微架构。 微架构介绍了特定处理器的工作方式。微架构就是对于 ARM 架构的进一步的实现

    在这里插入图片描述
    微架构包括以下内容:

    • 管道长度和布局
    • 缓存的数量和大小
    • 单个指令的循环计数
    • 实现了哪些可选功能

      一个 ARM 架构可以有多个不同的微架构以实现针对多种应用环境。例如,ARM 自己提供的各种 ARM 核就是一个个不同的微架构。

    系统架构(System Architecture)

      除了上面说的 ARM 架构之外,ARM 对构成现代芯片上系统(SoC)的许多组件都有类似的规范。ARM 系统架构定义了相关组件和接口,使硬件和软件更容易进行互操作。系统架构的整体框图如下图所示:
    在这里插入图片描述
      规范是软件兼容性的基础。根据规范构建硬件意味着可以编写与之相匹配的软件。根据规范编写软件意味着它可以在兼容的硬件上运行。ARM 架构是基础,通过指令集架构(Instruction Set Architecture,ISA)兼容性提供了一个通用的程序员模型。
    在这里插入图片描述
      基本系统架构(The Base System Architecture,BSA)规范描述了系统软件可以依赖的硬件系统架构。BSA 涵盖了处理器和系统架构的各个方面,例如中断控制器、计时器和操作系统需要的其他常见设备。这为标准操作系统、管理程序和固件提供了可靠的平台。

      基本引导需求(The Base Boot Requirements,BBR)规范涵盖了基于 Arm 架构的系统以及操作系统和管理程序可以依赖的系统需求。该规范建立了固件接口要求,如 PSCI、SMCCC、UEFI、ACPI 和 SMBIOS。

      其他标准可以建立在 BSA 的基础上,以提供特定于市场的标准化。 例如,服务器基础系统架构 (SBSA) 是针对服务器的 BSA 的补充。 SBSA 描述了服务器操作系统的硬件和功能要求。
    在这里插入图片描述

    • Generic Interrupt Controller: 通用中断控制器(GIC) 规范定义了 Armv7-A/R 和 Armv8-A/R 的标准化中断控制器。通用中断控制器(GIC)从外设接收中断,按优先级排列它们,并将它们交付给适当的处理器核心。
      在这里插入图片描述
        目前,GIC 已经发展到了第四代。ARM 官方提供了 《ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification》和《Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3 and 4》这两个文档来介绍 GIC。

      注意:M-Profile 使用的是 NVIC 中断控制器。

    • System Memory Management Unit: 系统内存管理单元(SMMU,有时也称为 IOMMU)为非处理器主机提供翻译服务。
        目前,SMMU 已经发展到了第三代,ARM 官方提供了 《ARM System Memory Management Unit Architecture Specification - SMMU architecture version 2.0》和《Arm System Memory Management Unit Architecture Specification, SMMU architecture version 3》这两个文档来介绍 SMMU。

    • Generic Timer: 通用定时器为系统中的所有处理器提供公共参考系统计数。 这些计时器提供用于诸如操作系统调度程序滴答之类的功能。 通用定时器是 Arm 架构的一部分,但系统计数器是一个系统组件。

    • Server Base System Architecture and Trusted Base System Architecture: 服务器基础系统架构 (SBSA) 和可信基础系统架构 (TBSA) 为 SoC 开发人员提供系统设计指南。

    • Advanced Microcontroller Bus Architecture: 高级微控制器总线架构 (AMBA) 总线协议系列控制基于 Arm 的系统中组件的连接方式以及这些连接上的协议。

    • CoreSight Architecture: CoreSight 架构为实时调试和收集跟踪信息提供了系统范围的解决方案。

    指令集架构

      指令集架构(Instruction Set Architecture,ISA)是计算机抽象模型的一部分。它定义了软件如何控制 CPU。Arm ISA 允许开发人员编写符合 Arm 规范的软件和固件,以此实现在任何基于 Arm 的处理器上都可以以同样的方式执行它们。ARM 指令集架构有三种:

    • A64: A64 指令集是在 Armv8-A 中引入的,以支持 64 位架构。A64 指令集有固定的 32 位指令长度。主要的特性有:

      • Clean decode table based on 5-bit register specifiers.
      • Instruction semantics broadly similar to A32 and T32.
      • 31 general-purpose 64-bit registers accessible at all times.
      • No modal banking of general purpose registers for improved performance and energy.
      • Program counter and stack pointer are not general purpose registers.
      • Dedicated zero register available for most instructions.
    • A32: A32 指令集有固定的 32 位指令长度,并在 4 字节边界上对齐。A32 指令集就是在 Armv6 和 Armv7 架构中我们常说的 ARM 指令集,Armv8 及之后改名 A32 以与 A64 进行区分。 随着 Thumb-2 技术的引入,它的大部分功能都被纳入了 T32 中。
        A32 指令主要被用于 A-profile 和 R-profile。

    • T32: T32 指令集最初是作为 16 位指令的补充集引入的,用于改进的用户代码的代码密度。随着时间的推移,T32 演变成 16 位和 32 位混合长度的指令集。因此,编译器可以在单个指令集中平衡性能和代码大小。
        T32 指令集就是在在 Armv6 和 Armv7 架构中被我们所熟知的 Thumb 指令集,Armv8 及之后改名为 T32。 T32 支持所有架构的 Profile,并且是 M-Profile 架构所支持的唯一指令集。

    指令集是架构参数手册中一个重要的章节,详细的介绍可以在对应版本的架构参考手册中找到。

      以上这三种指令集被称为 ARM 基础指令集(ARM Base ISAs),除此之外,ARM 还提供指令集扩展:自定义指令、DSP、浮点等等。其中以我用的最多的浮点来简单说明一下。

    ARM 浮点处理

      最近项目中用到了大量的浮点运算,且要求的时间精度较高,但是在使用过程中发现,总是会超过时间限制。最终经过测试发现,程序中的浮点运算 sqrt 占用了大量时间,单个执行 sqrt 需要 30多个微妙。

      我实际用的是基于 Cortex-m4f 核的 MCU,主频 128M,感觉单个执行 sqrt 需要时间有些过长于是开始在 ARM 官网找资料,结合 CMSIS 的代码,开始一步一步定位问题:

    1. 首先,根据 ARM 手册, Cortex-m4f 内核集成了浮点运算单元(FPU)和 DSP,实现单精度浮点算术运算,支持所有 ARM 单精度数据处理指令和数据类型,支持完整 DSP 指令集。
    2. 检查 CMSIS 代码中的相关配置也没有问题
      在这里插入图片描述
    3. 接着查看 CMSIS 提供的专用 DSP 驱动库,在众多接口中偶然发现 arm_sqrt_f32 这个接口,其位于 CMSIS 的 arm_math.h 中,具体定义如下:
       /**
        * @brief  Floating-point square root function.
        * @param[in]  in     input value.
        * @param[out] *pOut  square root of input value.
        * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
        * <code>in</code> is negative value and returns zero output for negative values.
        */
      
       static __INLINE arm_status arm_sqrt_f32(
       float32_t in,
       float32_t * pOut)
       {
         if(in >= 0.0f)
         {
      
       //      #if __FPU_USED
       #if (__FPU_USED == 1) && defined ( __CC_ARM   )
             *pOut = __sqrtf(in);
       #else
           *pOut = sqrtf(in);
       #endif
       
             return (ARM_MATH_SUCCESS);
         }
         else
         {
           *pOut = 0.0f;
           return (ARM_MATH_ARGUMENT_ERROR);
         }
       }
      

    从上面的定义不难看出,我们需要使用 ARM 顶一个的各种浮点运算接口才可以正常使用 浮点运算单元。

    总结一下在使用浮点运算是需要注意一下几点:

    1. Cortex-M4 中集成的浮点运算单元是单精度浮点运算单元。因此,所有的浮点数运算最好都使用 float 类型,常数一定加上 f 后缀。(部分 Cortex-M7 集成了 双精度浮点运算单元)
    2. 使用 arm_math.h 及 DSP 库中定义的相关浮点数运算接口。例如,C 语言的 sqrt 可以使用 arm_sqrt_f32 代替,三角函数 sin 可以使用 arm_sin 代替等等。注意,使用 arm_math.h 及 DSP 库中相关接口时需要配置一些宏值。

    ARM IP

      ARM 不仅仅制定规范,还会在规范的基础上进一步设计,这些设计被称为 IP(Intellectual Property,知识产权)。ARM IP 有很多种:Processors(也就是我们平时说 ARM 核)、Graphics and Multimedia、System IP、Physical IP、Security IP、Subsystem。
    在这里插入图片描述

    Processors

      Processors 即 ARM 核,也即 ARM CPU。就是一些可重复利用的、具有特定功能的集成电路模块。下图显示了 ARM 架构以及 ARM 核对应的关系:
    在这里插入图片描述
    从上如图中我们可以不难看出如下几点:

    1. ARM 架构版本很多,但是并不是每个 ARM 架构都有实际的实现。甚至于 ARM 自己也没有实现部分版本的架构
    2. 有部分第三方公司也基于 ARM 架构设计了自己的核心,例如苹果公司。这是由于 苹果公司具有 ARM 架构的授权。

      ARM 为自己设计的核起了一个统一的品牌名字:Arm Cortex,同时针对不同的应用场景,分为了 Application Processors(应用处理器)Arm Cortex-A、Real-time Processors (实时处理器)Arm Cortex-R、Microcontroller Processors(微控制器处理器)Arm Cortex-M 三种不同的 Profile 。
    在这里插入图片描述
    除了以上我们比较常见的 ARM 核,ARM 还设计了其他一些处理器
    在这里插入图片描述

    System IP

      Arm System IP 使系统设计人员能够配置和构建高性能、高能效的 SoC,同时通过行业标准 AMBA 接口将 Arm 处理器与他们自己的 IP 元素相结合,从而进一步区分。

    AMBA(高级微控制器总线架构)是一种免费提供的开放标准,用于连接和管理片上系统 (SoC) 中的功能模块。 它有助于多处理器设计的一次性开发,具有大量控制器和外设。

    Physical IP

      Arm Artisan Physical IP 提供业界最全面、最先进的物理IP解决方案。使用 Arm ArtisanPhysical IP 可以有效地实现复杂的 SoC 设计。

    Graphics and Multimedia Processors

    • Arm Mali GPU IP
      在这里插入图片描述
    • Mali Camera Image Signal Processors (ISPs)
      在这里插入图片描述

    授权方式

      从很多资料中,我们都能找到这样一句话 “ARM 本身并不制造和销售芯片,而是将设计授权给其他公司”。在多年发展中,ARM 逐渐形成了多种授权方式(等级),不同的授权方式,被授权方的权限不同。

      ARM 主要有三种授权等级:使用层级授权、 内核层级授权和架构/指令集层级授权,其中指令集层级授权等级最高,企业可以对 ARM 指令集进行改造以实现自行设计处理器,如苹果在 ARM v7-A 架构基础上开发出苹果 Swift 架构,其他如高通 Krait、Marvell 等都是基于 ARM 指令集或微架构进行的改造所得。

    Arm core licensees

      前面我们介绍了 ARM 本身设计了很多 ARM 核,Core licensees 就是把这些核授权给购买者,购买者可以使用这些核来构建自己的 MCU、SoC。

    Arm architectural licensees

      牛逼的公司还可以购买 ARM 架构许可,使用 ARM 指令集设计自己的 CPU 核。这些核心必须完全符合 ARM 架构。其中,最为人所致的就是苹果公司。2013 年,Arm 表示大约有15 家公司被授予架构许可。

    Built on ARM Cortex Technology licence

      2016 年 2 月,ARM 宣布了 Built on ARM Cortex Technology 许可证,通常简称为 Built on Cortex (BoC) 许可证。该许可证允许授权公司与 ARM 合作,并对 ARM Cortex 的设计进行修改。这些设计修改不会与其他公司共享。其中比较为人所知的就是高通。

    ARM Flexible Access

      2019 年 7 月16 日,ARM 宣布了 ARM Flexible Access。ARM Flexible Access 为开发提供了对包括 ARM IP 的无限访问。

    其他

      除了上面说的这些,ARM 自己设计的其他 IP 也有对应的授权方式。例如,Mali licensees 授权给第三方使用 ARM 设计的 GPU。

    参考

    1. https://developer.arm.com/
    2. https://en.wikipedia.org/wiki/ARM_architecture
    展开全文
  • 数据中心风起云涌,Ampere全新80核arm架构处理器能否突破x86封锁线.pdf
  • arm架构下的postgresql库文件,postgresql版本postgresql-11.1.tar.bz2。本类库我为编译poco,poco可编译。
  • SKEE——针对ARM架构的轻量级Linux内核安全执行环境.pdf
  • 包括《ARM v7 架构》、《ARM v8 架构》、《ARM® AMBA® 5 AHB Protocol》、《AMBA® 4 AXI4-Stream Protocol》、《IHI0048B_b_gic_architecture_specification》、《DDI0464F_cortex_a7_mpcore_r0p5_trm》、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,352
精华内容 41,340
关键字:

arm架构

友情链接: zonghesample.rar