Linux学习(2)Cortex-A7架构详细介绍

这里写目录标题

  • Cortex-A7框架
    • 运行模式
    • Cortex-A 寄存器组(内核寄存器)
    • 通用寄存器
      • 未备份寄存器
      • 备份寄存器(R8~R12)
      • R13 SP 堆栈指针
      • R14 LR 连接寄存器
      • R15 PC 程序计数器
      • 程序状态寄存器 CPSR

Cortex-A7框架

运行模式

Cortex-A 处理器九种运行模式
以前的 ARM 处理器有 7 种运行模型:User、FIQ、IRQ、Supervisor(SVC)、Abort、Undef和 System,其中 User 是非特权模式(某些访问受限,比如你的开机密码),其余 6 种都是特权模式(访问不受限)。但新的 Cortex-A 架构加入了TrustZone 安全扩展,所以就新加了一种运行模式:Monitor,新的处理器架构还支持虚拟化扩展,因此又加入了另一个运行模式:Hyp,所以 Cortex-A7 处理器有 9 种

模式 描述
User(USR) 用户模式,非特权模式,大部分程序运行的时候就处于此模式
FIQ 快速中断模式,进入 FIQ 中断异常
IRQ 一般中断模式(FIQ、IRQ二者区别)
Supervisor(SVC) 超级管理员模式,特权模式,供操作系统使用
Monitor(MON) 监视模式?这个模式用于安全扩展模式
Abort(ABT) 数据访问终止模式,用于虚拟存储以及存储保护
Hyp(HYP) 超级监视模式?用于虚拟化扩展
Undef(UND) 未定义指令终止模式
System(SYS) 系统模式,用于运行特权级的操作系统任务

中断或异常发生以后,处理器就会进入到相应的异常模式中,每一种模式都有一组寄存器提供异常处理程序使用,这样的目的是为了保证在进入异常模式以后,用户模式下的寄存器不会被破坏。

如果学过 STM32 和 UCOS、FreeRTOS 就会知道,STM32 只有两种运行模式,特权模式和非特权模式,但是 Cortex-A 就有 9 种运行模式。

Cortex-A 寄存器组(内核寄存器)

这个是内核寄存器组,和芯片的外设RAM寄存器是有区别的。
ARM 架构提供了16个 32位通用寄存器R0-R15前15个R0-R14可以用作通用的数据存储,R15是程序计数器 PC,用来保存将要执行的指令。ARM 还提供了一个当前程序状态寄存器 CPSR 和一个备份程序状态寄存器 SPSR,SPSR 寄存器就是 CPSR 寄存器的备份(标了虚线,表示有些模式下是没有的)。
R13寄存器就是堆栈指针SP寄存器

Linux学习(2)Cortex-A7架构详细介绍_第1张图片
Cortex-A7 有 9 种运行模式,每一种运行模式都有一组与之对应的寄存器。每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器 PC。在这些寄存器中,有些是所有模式所共用的同一个物理寄存器,有一些是各模式自己所独立拥有的,各个模式所拥有的寄存器如表:
Linux学习(2)Cortex-A7架构详细介绍_第2张图片
浅色字体的是与 user模式所共用的寄存器,蓝色背景是各个模式所独有的寄存器。可以看出,在所有的模式中,低寄存器组R0-R7是共用同一组物理寄存器,只有一些高寄存器组在不同的模式下有自己独有的寄存器。假如某个程序在 FIQ 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_fiq,如果程序处于 SVC 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_svc。总结一下,Cortex-A 内核寄存器组成如下:

通用寄存器

R0~R15 就是通用寄存器,通用寄存器可以分为以下三类:
①、未备份寄存器,即 R0~R7。
②、备份寄存器,即 R8~R14。
③、程序计数器 PC,即 R15

未备份寄存器

未备份寄存器指的是 R0~R7 这 8 个寄存器,因为在所有的处理器模式下这 8 个寄存器都是同一个物理寄存器,在不同的模式下,这 8 个寄存器中的数据就会被破坏。所以这 8个寄存器并没有被用作特殊用途

备份寄存器(R8~R12)

备份寄存器R8~R12这5个寄存器只有2个物理地址,在快速中断模式下(FIQ)对应的是Rx_irq(x=8-12)物理寄存器,其他模式对应的是Rx_(x=8-12)
FIQ 模式下中断处理程序可以使用 R8~R12寄存器,因为 FIQ 模式下的 R8~R12 是独立的,因此中断处理程序可以不用执行保存和恢复中断现场的指令,从而加速中断的执行过程。

R13 SP 堆栈指针

R13一共有8个物理寄存器,每种模式下一个,R13也叫SP指针,指向该模式专用的栈地址
当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。

R14 LR 连接寄存器

  1. 存放当前子程序的返回地址
    如果使用 BL 或者 BLX来调用子函数的话,R14(LR)被设置成该子函数的返回地址,在子函数中,将 R14(LR)中的值赋给 R15(PC)即可完成子函数返回。
  2. 当异常发生以后,该异常模式对应的R14寄存器被设置成该异常模式将要返回的地址,R14 也可以当作普通寄存器使用。

R15 PC 程序计数器

R15 保存着当前执行的指令地址加8个字节,这是因为 ARM的流水线机制导致的。ARM 处理器 3 级流水线:取值->译码->执行,这三级流水线循环执行,比如当前正在执行第一条指令,同时也对第二条指令进行译码,第三条指令也同时被取出存放在 R15(PC)中。
我们都是以当前正在执行的指令为产考点,那么PC中存放的就是第三条指令。

R15 (PC)= 当前执行的程序位置 + 8 个字节
0X2000 MOV R1, R0 ;执行
0X2004 MOV R2, R3 ;译码 
0X2008 MOV R4, R5 ;取值PC

程序状态寄存器 CPSR

所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位,当前处理器模式标志等一些状态位以及一些控制位。
所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。

你可能感兴趣的:(Linux学习,linux,学习,架构)