文章目录

  • 前言
  • 一、ARM内核与架构
    • 1.1 ARM芯片的组成
    • 1.2 ARM指令集与架构
  • 二、ARM处理器模式与寄存器
    • 2.1 ARM处理器模式
    • 2.2 ARM寄存器

前言

该文章是通过学习《ARM体系结构与编程》 杜春雷的书,这本书描述的是以ARM v6之前的体系架构为基础的,相对比较老,不过对于初学者还是有很多可以借鉴的地方,并结合网上资料所做的笔记,希望可以共同进步。


一、ARM内核与架构

1.1 ARM芯片的组成

  任何一款arm芯片主要由两大部分组成:arm内核 、外设 。

  1. arm内核: arm内核主要由:寄存器 、指令集 、总线 、存储器映射规则 、中断逻辑 和调试组件等。内核是由ARM公司设计并以销售方式授权给个芯片厂商使用的(ARM公司本身不做芯片)。比如为高速度设计的Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(就 是内核) ,后者是指令集的架构(也简称架构)
  2. 外设: 包括计时器、A/D转换器、存储器、I2C、UART、SPI、ROM等等。由各个芯片厂商自己设计并与ARM内核衔接配套。不同的芯片厂商就有不同的外设,因此构成了数量和规格庞大的ARM芯片产业。

1.2 ARM指令集与架构

  1. ARM指令集介绍
     指令集的设计是处理器结构中最重要的部分,用arm的术语称之为ISA(Instruction Set Architecture)。
     指令集可以说是cpu设计的灵魂,是打开CPU这个潘多拉魔盒的咒语,要想使用cpu,我们只能通过这些指令来操作cpu。
    对于32位的cpu,这些指令就是一个个32位的01的序列,不同的值就代表了不同的机器指令 ,cpu的硬件能完美的解析并执行这些指令,比如寻址、运算、异常处理等等。

  2. ARM处理器架构
      Cortex-A32/35/53/57/72/73/77/78采用的都是ARMv8 架构,这是ARM公司的首款支持64位指令集的处理器架构 。
    (1)ARM11之前的处理器和指令集架构对应关系如下:

    体系架构处理器家族
    ARMv1ARM1
    ARMv2ARM2、ARM3
    ARMv3ARM6、ARM600、ARM610、ARM7、ARM700、ARM710
    ARMv4StrongARM、ARM8、ARM810、ARM7-TDMI、ARM9-TDMI
    ARMv5ARM7EJ、ARM9E、ARM10E、XScale
    ARMv6ARM11

(2)ARM11之后处理器和指令集架构

  ARM11芯片之后,也就是从ARMv7架构 开始,ARM的命名方式有所改变。
 新的处理器家族,改以Cortex命名,并分为三个系列,分别是Cortex-A,Cortex-R,Cortex-M。
 1)Cortex-A系列(A:Application 应用)
 面向性能密集型系统的应用处理器内核。*针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域 ,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。
 2)Cortex-R系列 (R:Real-time 实时)
 面向实时应用的高性能内核。*针对需要运行实时操作的系统应用,面向如汽车制动系统 、动力传动解决方案 、大容量存储控制器 等深层嵌入式实时应用。
 3)Cortex-M系列(M:MCU & FPGA)
 面向各类嵌入式应用的微控制器内核。
 4)Cortex-SC系列(SC:SecurCore)
 其实,除了上述三大系列之外,还有一个主打安全的Cortex-SC系列(SC:SecurCore),主要用于政府安全芯片 。


二、ARM处理器模式与寄存器

2.1 ARM处理器模式

  ARM处理器共有7种运行模式,分别为用户(usr)、快速中断(fiq)、外部中断(irq)、特权(svc)、中止(abt)、未定义指令中止(und)和系统模式(sys)。

  在特权模式下程序可以访问所有的系统资源。非特权模式和特权模式之间的区别在于有些操作只能在特权模式下才被允许,例如直接改变模式和中断使能等。而且为了保证数据安全,一般MMU会对地址空间进行划分,只有特权模式才能访问所有的地址空间。而用户模式如果需要访问硬件,必须切换到特权模式下,才允许访问硬件。

2.2 ARM寄存器

  • ARM共有37个寄存器,都是32位长度的
    1)31个通用寄存器,包括程序计数器(PC)在内;
    2)6个状态寄存器,包括1个当前状态寄存器和5个备份状态寄存器(影子寄存器)。目前只使用了其中12位。

  • ARM各工作模式下的寄存器

  • Thumb状态下的寄存器

  • ARM各寄存器介绍

  1. 未分组寄存器 R0 ~ R7,共 8 个。在所有的运行模式下都使用同一个物理寄存器,它们未被系统用作特殊的用途。

  2. 分组寄存器 R8 ~ R12,R13 ~ R14
    (1)R8 ~ R12:( 总共10个 )
     每次所访问的物理寄存器与处理器当前的运行模式有关,R8~R12:每个寄存器对应两个不同的物理寄存器当使用fiq模式时,访问寄存器R8_fiq~R12_fiq,当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。其中 FIQ 模式有单独的一组 R8 ~ R12,共5个;( FIQ ( 快速中断模式 ) 时访问寄存器 R8_fiq ~ R12_fiq )另外 6 种模式共用一组 R8 ~ R12,共5个;(当使用除 FIQ 模式以外的其他模式时,访问寄存器 R8 ~ R12)
    (2) R13 ~ R14:( 总共12个 )
     其中 USR 和 SYS 模式(表格的第一列)共用一组 R13 ~ R14 共2个,
     另外 5 种模式下各有独自的一组 R13 ~ R14,并采用以下记号来区分不同的物理寄存器,分别为 fiq、irq、svc、abt、und。共10个。( mode为以下几种之一:usr、fiq、irq、svc、abt、und)
     1)R13 在 ARM 指令中常用作堆栈指针 SP。由于每一种模式都有自己的 R13,所以我们在自己初始化的时候一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间
     2)R14 称为子程序链接寄存器 LR (Link Register),即在调用子程序的时候,可以将当前的程序地址存入LR寄存器,这样就方便了函数的返回。它有两个特殊功能,一种是每一种模式下都可以用于保存函数的返回地址,通常LR会配合BL和BLX来使用;另外就是异常处理后的返回地址,如中断。

  3. PC 指针( R15 )

      R15 用作程序计数器 ( PC ),对应一个物理寄存器,由于 ARM 体系结构采用了多级流水线技术,对于 ARM 指令集而言,PC 总是指向当前指令的下两条指令的地址,可以通过向 pc 赋值,来控制程序跳转,即 PC 的值为当前指令的地址值加8个字节。

  4. CPSR (1 个 状态寄存器,当前程序状态寄存器 )

  5. SPSR ( 5 个 备份状态寄存器 )

  SPSR(备份的程序状态寄存器,或者叫 影子寄存器)。
 SPSR 除 usr、sys 外,对应用于异常保护的 CPSR 的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器。