CPU架构之cpu模式

CPU架构之cpu模式

1 CPU state

1.1 state简介

在ARM体系结构中,状态描述了以下不同的概念:

  • 1) Instruction set state
    ARMv7提供了四种指令集状态。 指令集状态确定正在执行的指令集,并且是ARM状态,Thumb状态,Jazelle状态或ThumbEE状态之一。
  • 2) Execution state
    执行状态由指令集状态和一些控制位组成,这些控制位修改了指令流的解码方式。
  • 3) Security state
    在ARM体系结构中,安全状态的数量取决于实现是否包括安全扩展:
    a) 包含安全扩展的实现提供两个安全状态,安全状态和非安全状态。每个安全状态都有其自己的系统寄存器和内存地址空间。
    安全状态在很大程度上与处理器模式无关。 安全状态和处理器模式的这种独立性的唯一例外是:
    — 监视模式,仅在安全状态下存在,并支持在安全状态和非安全状态之间的转换。
    — Hyp模式,是Virtualization Extensions的一部分,仅在Non-secure状态下退出,因为Virtualization Extensions仅支持Non-secure状态的虚拟化。
    某些系统控制资源只能从“安全”状态访问。
    b) 不包括安全扩展的实现仅提供单个安全状态。
    c) Secure software是指以安全状态运行的软件。
    d) Non-secure software是指以非安全状态运行的软件。
    4) Debug state

调试状态是指出于调试目的而暂停处理器,因为将处理器配置为暂停调试模式时已发生调试事件。

1.2 Instruction set state

指令集状态寄存器ISETSTATE的格式为:
在这里插入图片描述在这里插入图片描述

1.2.1 ARM state

待补充。

1.2.2 Thumb state

待补充。

1.2.3 Jazelle state

处理器执行Java字节码作为Java虚拟机(JVM)的一部分。
当处理器处于Jazelle状态时,它将执行字节码程序。字节码程序定义为包含一个或多个类文件的可执行对象,或者从一个或多个类文件派生并在功能上等效于一个或多个类文件。有关类文件的定义,请参见Java虚拟机规范。
当处理器处于Jazelle状态时,PC会识别要执行的下一个JVM字节码。 JVM字节码是Java虚拟机规范中定义的字节码,或者是该规范中定义的字节码的功能等效转换版本。
对于Jazelle扩展,必须仅使用来自ARM,Thumb和ThumbEE指令集的指令来指定Java虚拟机规范中描述的本机方法的功能。
Jazelle扩展的实现不得在执行时记录或提升为执行任何任务
除了按照本节和Java虚拟机规范中的说明进行字节码程序加速之外,还处于Jazelle状态。

1.2.4 ThumbEE state
1.2.4.1 简介

Thumb Execution Environment(ThumbEE)是Thumb指令集的一种变体,被设计为动态生成代码的目标。这是在执行之前或执行期间从便携式字节码或其他中间或本机表示形式在设备上编译的代码。ThumbEE提供对即时(JIT),动态自适应编译(DAC)和提前(AOT)编译器的支持,但不能与ARM和Thumb指令集自由交互。
ThumbEE特别适用于具有托管指针和数组类型的语言。处理器处于ThumbEE指令集状态时,将执行ThumbEE指令。
ThumbEE既是指令集的名称,也是为该指令集提供支持的扩展的名称。ThumbEE扩展为:
•在ARMv7-A配置文件的实现中是必需的。
•在ARMv7-R配置文件的实现中是可选的。
处理器执行专门针对与执行环境相关联的动态编译技术使用的Thumb指令集的变体。 这可以是Java或其他执行环境。该功能在ARMv7-A中是必需的,而在ARMv7-R中是可选的。

1.2.4.2 ThumbEE instructions

在ThumbEE状态下,处理器执行与Thumb状态下几乎相同的指令集。但是,有些指令的行为有所不同,有些指令被删除,而某些ThumbEE指令被添加。
关键区别在于:
•用于更改在Thumb状态和ThumbEE状态下设置的指令集的其他指令。
•新的ThumbEE指令分支到处理程序。
•空指针检查在ThumbEE状态下执行的加载/存储指令。
•处于ThumbEE状态的附加指令,用于检查数组范围。
•对加载,存储和控制流指令的其他一些修改。

2 Privilege level(权限等级)

特权级别是在特定安全性状态下由处理器模式确定的软件执行的属性,如下所示:

  • 1) Secure state
    在安全状态下,有两个特权级别:
    PL0在用户模式下执行的软件在PL0执行。
    PL1以用户模式以外的任何模式执行的软件均在PL1执行。
  • 2) Non-secure state
    在“非安全”状态下,有两个或三个特权级别:
    PL0在用户模式下执行的软件在PL0执行。
    PL1在用户或超级模式以外的任何模式下执行的软件均在PL1上执行。
    PL2在包括虚拟化扩展的实现中,以Hyp模式执行的软件在PL2执行。
    有时将PL0处的软件执行描述为非特权执行(非特权模式)。与特定特权级别PLn相关的模式可以描述为PLn模式(特权模式)。

注:
• 特权级别定义了在当前安全状态下访问资源的能力,并不暗含在其他安全状态下访问资源的能力。
• 不包括虚拟化扩展的实现不具有只能从PL2特权级别访问的非安全资源。

3 ARM processor modes

3.1 armv7编程模式简介

在这里插入图片描述

User mode(用户模式):

操作系统以用户模式运行应用程序,以限制系统资源的使用。以用户模式执行的软件在PL0执行。在用户模式下执行有时被描述为非特权执行。应用程序通常在用户模式下执行,在用户模式下执行的任何程序:
•只允许非特权访问系统资源,这意味着它不能访问受保护的系统资源。
•只允许非特权访问内存。
•不能改变cpu模式,除非引起异常。

FIQ mode(快速中断模式):

FIQ模式是执行FIQ中断的默认模式。Linux系统不使用此模式。
IRQ mode(中断模式):
IRQ模式是接受IRQ中断的默认模式。

Supervisor mode(src 管理模式):

管理模式是处理“Supervisor Call”异常的默认模式。
执行SVC(Supervisor调用)指令会生成Supervisor调用异常,该异常将进入Supervisor模式。
处理器在复位时进入超级用户模式。

Monitor mode(监控器模式):

监控器模式是执行“安全监控器调用”异常的模式。
在PL1模式下,执行SMC(Secure Monitor Call)指令会生成安全监视器调用异常。
监视模式是安全模式,这意味着无论SCR.NS位的值如何,它始终处于安全状态。
在“监视器”模式下运行的软件可以访问系统寄存器的安全副本和非安全副本。这意味着“监视”模式提供了在“安全”和“非安全”安全状态之间进行切换的常规方法。
注:
1) monitor mode:这是一种处理器模式,仅在实现包含安全扩展时才可用。 如本节所述,它在正常操作中用作在安全状态和非安全状态之间进行转换的机制。
2) monitor debug-mode:这是一种调试模式,无论实现是否包括安全性扩展,该模式都可用。

Abort mode(终止模式):

该模式分为指令预取终止和数据访问终止。终止模式是接受Data Abort异常或Prefetch Abort异常的默认模式。示例情型如下:
1)指令预取中止:CPU是以流水线方式来执行指令的,即执行当前指令时,同时在解析第二条指令并读取第三条指令,在读取第 3 条指令时称为预取,可能会发生错误。
2)比如 CPU 想要读写某个地址,改地址又是非法地址(不可访问地址),可能这个过程中会出错。
Hyp mode(Hypervisor mode 虚拟机监控程序模式):
Hyp模式是非安全PL2模式,作为Virtualization Extensions的一部分实现。 在从非安全状态中获取异常时必须进入PL2,才能进入Hyp模式
Hypervisor调用异常和Hyp Trap异常是作为Virtualization Extensions的一部分实现的异常,始终在Hyp模式下使用。

Undefined mode(未定义模式):

未定义模式是默认模式,与指令相关的异常(包括尝试执行UNDEFINED指令的任何尝试)将采用默认模式。

System mode(系统模式):

在系统模式下执行的软件在PL1执行。 系统模式具有与用户模式相同的寄存器,并且不会因任何异常进入。

3.2 编程模式小结

1) 除user模式外,其他模式均属于特权模式。
a) 在其他模式下,他们可以随便切换到其他的模式。而在user模式下,不能切换到其他模式;
b) 大多数程序运行于user模式,进入特权模式是为了处理中断、异常、或者访问被保护的系统资源;
c) 为什么user模式不能直接进入其他模式?
主要是写应用程序的开发人员水平差异较大,不能很好的保证程序的质量,user模式将限制应用程序的权限,防止其破坏整个系统。
2) 为什么有这么多的异常模式?
发生某些异常的时候,将触发异常中断进入该异常模式,在此模式下,更容易且更专业的处理此异常的相关操作。
3) 每种异常模式有哪些资源的差异?
主要是权限的差异,还有就是寄存器的差异。

4 ARM通用寄存器

4.1 通用寄存器描述

在应用程序级别视图中,ARM处理器具有:

  • 13个通用32位寄存器R0至R12。
  • 三个具有特殊用途的32位寄存器SP,LR和PC,分别为R13、R14、R15。
    特别寄存器描述如下:

SP, the stack pointer:
处理器使用SP作为活动堆栈的指针。
在Thumb指令集中,大多数指令无法访问SP。唯一可以访问SP的指令是那些旨在将SP用作堆栈指针的指令。
ARM指令集提供了对SP的更多常规访问,并且可以用作通用寄存器。但是,ARM不建议将SP用作堆栈指针以外的任何用途。
LR, the link register:
链接寄存器是可以保存返回链接信息的特殊寄存器。本手册中描述的某些情况要求使用LR。当软件不需要LR进行链接时,它可以将其用于其他目的。可以将LR称为R14。
PC, the program counter:

  • 执行ARM指令时,PC读取为当前指令的地址加8。
  • 执行Thumb指令时,PC读取为当前指令的地址加4。
  • 将地址写入PC会导致跳转到该地址。

大多数Thumb指令无法访问PC。

ARM指令集提供了对PC的更常规访问,许多ARM指令可以将PC用作通用寄存器。 但是,ARM禁止将PC用作程序计数器以外的任何用途。

4.2 cpu各模式下寄存器的差异

在这里插入图片描述
在处理异常时,处理器会更改模式,除非它已处于必须处理异常的模式。 处理器可能以这种方式进入的每种模式都具有:

  • 某些异常模式有其私有的SP寄存器,例如SP_irq和SP_hyp。
  • 包含异常的首选返回地址的寄存器。 这是:
    — 对于每种PL1模式,链接寄存器的库副本,例如LR_und和LR_mon。
    — 对于PL2模式,Hyp模式,特殊寄存器ELR_hyp。
  • 在异常条目(例如SPSR_irq和SPSR_hyp)上制作的CPSR的已保存副本。

此外,FIQ模式具有私有的R8~R12寄存器。
用户模式和系统模式共享相同的ARM内核寄存器。
用户模式,系统模式和hyp模式共享相同的LR。

5 ARM状态寄存器

应用程序级程序员的模型提供了Application Program Status Register(APSR)。Current Program Status Register(CPSR)的应用程序级别别名。CPSR的系统级视图扩展了寄存器,并添加了系统级信息。
每种模式都有其自己的CPSR副本备份寄存器,即Saved Program Status Register(SPSR)。 例如,用于Monitor模式的SPSR称为SPSR_mon。

5.1 APSR寄存器

在这里插入图片描述

  • 保留位,已分配给系统功能,或可用于将来的扩展。非特权执行将忽略对仅在PL1或更高版本可访问的字段的写入。但是,写入APSR的应用程序级软件必须将保留的位视为请勿修改(DNM)位。有关保留位的更多信息, CPSR和SPSR的寄存器。
    尽管在读取时[15:0]位是未知的,但在读取APSR时允许:
    bit[9] CPSR.E的返回值。
    bit[8:6] CPSR.{A,I,F}的返回值。

  • 可以通过许多指令设置的位:
    — 条件标志:
    N,bit[31] 否定条件标志。设置为指令结果的位[31]。如果将结果视为二进制补码整数,则如果结果为负,则处理器将N设置为1,如果结果为正或零,则将N设置为0。
    Z,bit[30] 零条件标志。如果指令的结果为零,则设置为1,否则为0。零结果通常表示比较结果相等。
    C,bit[29] 携带状态标志。如果指令导致进位条件,例如加法时无符号溢出,则设置为1。
    V,bit[28] 溢出条件标志。如果指令导致溢出条件,例如加法运算中有符号的溢出,则设置为1。
    — 溢出或饱和标志
    Q,bit[27] 设置为1表示某些指令中发生溢出或饱和,通常与数字信号处理(DSP)有关。
    — 大于或等于标志
    GE[3:0], bits[19:16] 并行加法和减法指令中描述的指令将更新这些标志,以指示来自操作的一个字节或半字的结果。这些标志可以控制后面的SEL指令。

  • bit[26:24] 是RAZ / SBZP。因此,软件可以使用写入APSR最高字节的MSR指令,而无需使用读取,修改,写入序列。如果这样做,则必须将零写入位[26:24]。
    指令可以测试N,Z,C和V条件标志,并将它们与指令的条件代码结合起来以确定是否必须执行该指令。 以这种方式,指令的执行取决于先前操作的结果。

5.2 CPSR寄存器

对CPSR进行写操作会对处理器操作的各个方面产生副作用。除了与获取指令关联的存储器访问方面的副作用外,所有这些副作用均与CPSR写入同步。这意味着可以保证:

  • 对执行流中的较早指令不可见。

  • 对执行流中的后续指令可见。

与获取指令关联的内存访问的特权级别和地址空间取决于当前特权级别和安全性状态。写入CPSR.M可以更改特权级别和安全状态之一。特权级别或安全状态的更改对与提取指令关联的内存访问的影响是:

  • 与特权级别或安全状态的更改同步,如果该更改是由异常条目或异常返回引起的。
  • 保证对于在执行流中获取较早的指令而导致的任何内存访问都不可见。
  • 保证对于执行流中的下一个上下文同步操作之后提取任何指令所导致的任何内存访问都是可见的。
  • 在模式更改指令和保证模式更改的可见点之间获取指令可能会或可能不会影响内存访问。

5.3 SPSR寄存器

SPSR的目的是记录CPSR的例外值。发生异常时,会将CPSR复制到发生异常的模式的SPSR。保存此值意味着异常处理程序可以:

  • 在返回异常时,将CPSR恢复为刚发生异常之前的值。
  • 检查发生异常时CPSR的值,例如确定导致未定义指令异常的指令所在的指令集状态和特权级别。
    被执行。
    SPSR在重置时是未知的。在非安全PL1或PL0模式下的任何操作都会使SPSR_hyp未知。

5.4 CPSR和SPSR寄存器格式

在这里插入图片描述

条件标志,bit[31:28]
设置指令执行的结果。标志是:

  • N,bit[31] 否定条件标志。
  • Z,bit[30] 零条件标志。
  • C,bit[29] 携带状态标志。
  • V,bit[28] 溢出条件标志。
    Q,bit[27] 累积饱和位。详见APSR。
    IT[7:0], bits[15:10, 26:25]
  • Thumb-IT(If-Then)指令的If-Then执行状态位。
    J,bit[24] Jazelle位,请参见T位,位[5]的说明。
    bits[23:20] 保留位。RAZ/SBZP。
    GE[3:0], bits[19:16]
    • 大于或等于标志,用于并行加法和减法指令中描述的并行加法和减法(SIMD)指令。
      E,bit[9] 字节序执行状态位。 控制数据访问的加载和存储字节序:
      0小端运行。
      1 Big-endian操作。
      取指令将忽略此位。

mask bit,bit[8:6] 具体含义如下:

  • A,bit[8] 异步中止屏蔽位。
  • I,bit[7] IRQ屏蔽位。
  • F,bit[6] FIQ屏蔽位。
    每个bit的可能值为:
    0未屏蔽异常。
    1被屏蔽的异常。

T,bit[5] Thumb执行状态位。
该位和J执行状态位的位[24]确定处理器,ARM,Thumb,Jazelle或ThumbEE的指令集状态。CPSR.J和CPSR.T分别与ISETSTATE.J和ISETSTATE.T相同。
M [4:0],bit[4:0]
模式字段。该字段确定处理器的当前模式。M [4:0]的所有其他值均保留。将M [4:0]设置为保留值的效果是无法预料的。详见CPU编程模式。

6 异常处理流程

待补充。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值