这篇文章主要描述ARM体系结构相关内容,记录工作中用到的头天arm体系结构相关的知识,主要是关于V8-A版本的知识,会不定期的进行更新。

概述

ARM体系结构从最初的V1版本到现在已经有很大的变化,总共有8个版本:v1~v8,不过目前正在使用的只有v4 ~ v8,最被的3个版本已经被废弃。

从ARMv7开始,ARM将其体系结构分成3大不同应用,称之为ARM-A、ARM-R、ARM-M

  • A:高性能应用处理器(本文主要描述这种)
  • R:实时操作应用
  • M:微处理器应用

目前最新的版本是v8,在v7的基础上做了很大的改动:

  • 支持64位工作模式,64位工作模式时称之为AArch64,32位工作模式时称之为AArch32(兼容以前的版本)
  • 取消了CPU的工作模式,采用”异常级别”,有E0~E3 4种级别

异常级别

ARM v8的AArch64时取消了ARM v7的工作模式(User/FIQ/IRQ/…),相应的也取消了CPSR寄存器,改用EL0 - EL3 总共4种异常级别,其中:

  • EL3级别权限最高,EL0级别权限最低

  • EL0级别为非特权级别,EL1-EL3称为特权级别,通常应用程序在EL0级

  • 通常EL0级用于application,EL1用于kernel,EL2用于Hypervisor或虚拟化,EL3用于安全应用

  • EL3级别通过SCR_EL3控制EL2-EL0,EL2级别通过HCR_EL2控制EL1-EL0,

  • CPU必须实现EL0,EL1功能,EL2,EL3可以选择性实现,通过ID_AA64PFR0_EL1寄存器可看否实现了EL2及EL3

状态说明

  1. AArch64状态
  • 31个通用的64位寄存器:x0~x30,基中x30通常用于LP寄存器
  • 1个64位PC寄存器
  • 各种系统寄存器,比如SP、SPSR寄存器,每个系统寄存器有多个(异常类型不同),使用_ELx作为后缀
  • 32个128位的SIMD向量
  • 使用armv8的异常模式,有4种异常模式:E0~E3
  • 支持64位虚拟地址总线宽度
  • 有1个PE(处理器)状态寄存器PSTATE
  • 系统寄存器使用添加下标方式来访问不同模式下的寄存器,具体形式:\<register_name>_ELx

通用定时器

ARMv8核心提供了4个定时器

  • Hypervisor Physical Timer
  • Virtual Timer
  • Physical Timer(linux默认使用这个作为系统时钟)
  • Physical Secure Timer

所有定时器都使用同一个时钟源——系统时钟,一般CNTFRQ_EL0寄存器中会保存定时器的频率

有2个累加寄存器CNTPCT_EL0CNTVCT_EL0,分别用于Physical 和Virtual定时器,在CPU运行时累加寄存器会一直累加,寄存器是64位的,就算是10Ghz的主频来说可以运行57.4年,理论是够用的

每个定时器有独立的控制寄存器、比较寄存器、计数寄存器

可以通过适当的配置产生想的定时器及中断