您当前的位置: 首页 > 

韦东山

暂无认证

  • 0浏览

    0关注

    506博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

10_异常与中断

韦东山 发布时间:2022-01-13 16:03:50 ,浏览量:0

第十章 异常与中断

参考资料:

  • ARM® Cortex™-A Series Programmer’s Guide version4.0
  • ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition
  • Cortex™-A7 MPCore™Technical Reference Manual Revision: r0p5
  • ARM® Generic Interrupt Controller Architecture Specification Architecture version 2.0
  • 芯片手册《Chapter 3 & Chapter28 : Ultra Secured Digital Host Controller (uSDHC)》。

本章处理器架构的内容主要来自于ARM® Cortex™-A Series Programmer’s Guide version4.0。

10.1 ARM处理器模式和寄存器

​ ARM体系结构是一种基于模式的体系结构。在引入安全扩展之前,它具有7种处理器模式,如上表所示。有六个特权模式和一个非特权用户模式。特权是执行用户(非特权)模式无法完成的某些任务的能力。在用户模式下,对影响整个系统配置的操作存在一些限制,例如,MMU的配置和缓存操作。模式与异常事件相关。

​ TrustZone安全性扩展的引入了两个独立于特权模式和处理器模式的安全状态,并加入监控器模式(monitor mode)进行安全状态和非安全状态的切换。如下图所示:

​ 对于当前实现TrustZone扩展的处理器,系统安全是通过划分设备的所有硬件和软件资源属于安全世界或者非安全世界来实现的。处理器处于非安全状态时,它无法访问为安全状态分配的内存。

​ 在这种情况下,安全监控器充当在这两个世界之间切换的网关。如果实施了安全扩展,则在监视器模式下执行的软件将控制安全和不安全处理器状态之间的转换。

​ ARMv7-A体系结构虚拟化扩展,在现有的特权模式外,还添加了hypervisor mode(Hyp)。虚拟化使多个操作系统可以共存并在同一系统上运行。因此,ARM虚拟化扩展使在同一平台上运行多个操作系统成为可能。下图展示了hypervisor mode。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9bdZlMa-1642060160914)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/10_interrupt_image003.png)]

​ 如果实施了虚拟化扩展,则存在与以前的体系结构不同的特权模型。在非安全状态下,可以有三个特权级别,分别为PL0、PL1和PL2。

  • PL0: PL0是在用户模式下执行的应用程序软件的特权级别。在用户模式下执行的软件称为非特权软件。该软件无法访问该体系结构的某些功能。特别是,它不能更改许多配置设置。在PL0执行的软件只能进行非特权内存访问。
  • PL1 :PL1是指除用户模式和Hyp模式以外的所有模式。通常,操作系统软件在PL1执行,应用程序将在PL0(用户模式)下执行。
  • PL2:hypervisor使用PL2 Hyp mode,该模式可以控制并切换在PL1执行的不同的guest OS。如果实施了虚拟化扩展,则hypervisor将在PL2(Hyp模式)下执行。hypervisor将控制并使多个操作系统能够在同一处理器系统上共存并执行。

​ 下图显示了不同处理器状态下处理器可以处于的模式以及特权级别:

​ 处理器模式和安全状态以及特权等级的关系如下表所示:

​ 这些特权级别与TrustZone安全和普通(非安全)设置是分开的。

​ 特权级别定义了在当前安全状态下访问资源的能力,并不暗含在其他安全状态下访问资源的能力。

​ 通用操作系统(例如Linux)及其应用程序应在非安全状态下运行。安全状态一般由供应商特定的固件或对安全性敏感的软件来运行。一般在安全状态下运行的软件比在非安全状态下运行的软件具有更高的特权。

​ 当前的处理器模式和执行状态包含在当前程序状态寄存器(CPSR)中。可以通过异常或者在特权软件下显式地修改来进入到不同处理器模式。

10.1.1 寄存器

​ ARM体系结构提供了十六个32位通用寄存器(R0-R15)供软件使用0。其中的15个(R0-R14)可用于通用数据存储,而R15是程序计数器,其值随处理器执行指令而改变。显式地写入R15可以更改程序流程。软件还可以访问CPSR和SPSR中保存的先前运行模式的CPSR的副本。

​ 同一个寄存器可能在不同模式下对应物理上不同的位置。只有特定模式下才能访问到这些位置的寄存器。

​ 有些寄存器,不同的工作模式下有自己的副本,当切换到另一个工作模式时,那个工作模式的寄存器副本将被使用,这些寄存器被称为备份寄存器。备份寄存器在物理上使用不同的存储,通常仅在特定模式下才可以访问它们。下图中带阴影标记的寄存器都是备份寄存器。

​ 在所有模式下,“低位寄存器”和R15共享相同的物理存储位置。图3-5显示了某些模式下的某些“高位寄存器”被备份。例如,FIQ模式下使用R8-R12备份寄存器,也就是说,FIQ模式下对其的访问将转到另一个物理存储位置。对于除用户和系统模式以外的所有模式,R13和SPSR都是备份寄存器。

​ 对于备份寄存器,软件通常不会指定要访问哪个模式下的寄存器,这是由当前运行的模式隐含的。例如,访问R13的程序在用户模式下将访问R13_usr,在SVC模式下将访问R13_svc。

​ R13(在所有模式下)是堆栈指针,但是当堆栈操作不需要时,它可以用作通用寄存器。

​ R14(链接寄存器)保存BL分支指令的下一条指令的地址。当它不支持子程序的返回时,它也可以用作通用寄存器。R14_svc,R14_irq,R14_fiq,R14_abt和R14_und同样用于在发生中断和异常时,或者执行转移和链接指令时,备份R15的返回值。

​ R15是程序计数器并保存当前程序地址(实际上,在ARM状态下,它始终指向当前指令之前的八个字节,而在Thumb状态下,它始终指向当前指令之前的四个字节,这是原始ARM1的三级流水线的遗留特性)。在ARM状态下读取R15时,位[1:0]为零,位[31:2]包含PC值。在Thumb状态下,位[0]始终读为零。

​ R0-R14的复位值是不定的。在使用堆栈之前,必须通过引导代码初始化SP(堆栈指针)(针对每种模式)。ARM体系结构过程调用标准(AAPCS)或ARM嵌入式ABI(AEABI)指定了软件应如何使用通用寄存器,以便在不同的工具链或编程语言之间进行互操作。

Hypervisor模式

​ 支持虚拟化扩展的实现在管理程序(Hyp)模式下具有可用的其他寄存器。 Hypervisor模式以PL2特权级别运行。它可以访问自己的R13(SP_hyp)和SPSR副本。它使用用户模式下的链接寄存器存储函数的返回地址,并具有专用寄存器ELR_hyp来存储异常返回地址。 “ Hyp”模式仅在“正常”世界中可用,并提供虚拟化功能。

10.1.2 状态寄存器

​ 程序状态寄存器(CPSR,current programmer status register)包含处理器的状态和一些控制标记位。

​ 条件标记,bits[31:28]

​ 根据指令的执行结果设置,这些标记位是

​ N,bit[31]负数标记位

​ Z,bit[30]零标记位

​ C,bit[29]进位标记位

​ V,bit[28]溢出标记位

​ 这些条件标记位可以在任何模式下读写

​ GE[3:0],bit[19:16]一些SIMD指令使用

​ IT[7:2],bit[15:10]Thumb2指令集的If-then条件指令使用

​ J, bit[24] 处理器是否处于Jazelle状态,和T, bit[5]一起决定执行的指令集

​ E, bit[9] 大小端状态位,0表示小端,1表示大端。

​ Mask bits, bits[8:6]

​ A, bit[8] 异步中止禁止位Asynchronous abort mask bit.

​ I, bit[7] IRQ 禁止位

​ F, bit[6] FIQ 禁止位

​ Q,bit[27]为1的话,表明执行一些指令时出现饱和或者溢出,一般与DSP有关。

​ T, bit[5] Thumb指令位,和J,bit[24]位决定了处理器的指令集,ARM,Thumb,Jazzelle或者ThumbEE

​ M[4:0], bits[4:0]工作模式位,决定了处理器当前处于的工作模式。

​ 处理器可以使用直接写入CPSR模式位来实现模式之间切换。更常见的是,处理器会由于异常事件而自动切换模式。在用户模式下,无法改变处理器模式的PSR位[4:0]来切换模式和A,I和F位来使能或者禁止异步中止、IRQ和FIQ。

10.1.3 协处理器CP15

​ CP15是系统控制协处理器,可控制处理器核的许多功能。它可以包含16个32位主寄存器。对CP15的访问受权限控制,并且在用户模式下并非所有寄存器都可用。CP15寄存器访问指令指定所需的主寄存器,指令中的其他字段用于更精确地定义访问并增加CP15中的物理32位寄存器的数量。CP15中的16个主要寄存器的名称为c0至c15,但通常使用名称来引用。例如,CP15系统控制寄存器称为CP15.SCTLR。

​ 通过从一个通用寄存器(Rt)读取或写入位于CP15内的一组寄存器(CRn)中,可以控制系统架构的某些功能。该指令的Op1,Op2和CRm字段也可以用于选择寄存器或操作。 格式如下所示:

​ 从CP15寄存器读值到ARM寄存器

​ MRC p15, Op1, Rt, CRn, CRm, Op2 ; read a CP15 register into an ARM register

​ 从ARM寄存器写值到CP15寄存器

​ MCR p15, Op1, Rt, CRn, CRm, Op2 ; write a CP15 register from an ARM register

10.1.3.1 System control register (SCTLR)

​ SCTLR是通过CP15访问的寄存器,它控制存储器,系统功能,并提供反映处理器核中实现的功能的状态信息。

​ 系统控制寄存器只能从PL1或更高特权等级访问。

​ 各个位的描述如下:

​ •TE –Thumb异常使能。这可以控制异常进入ARM状态,还是Thumb状态。

​ •NMFI –是否支持不可屏蔽的FIQ(NMFI)支持。

​ •EE =异常字节序。这定义了在异常时的字节序,的CPSR.E位的值。

​ •U –使用对齐模型。

​ •FI – FIQ配置启用。

​ •V –该位选择异常向量表的基地址。

​ •I –指令缓存使能位。

​ •Z –分支预测使能位。

​ •C –缓存使能位。

​ •A –对齐检查使能位。

​ •M –启用MMU。

​ 引导代码序列的一部分通常将是设置CP15:SCTLR系统控制寄存器中的Z位,以启用分支预测功能。操作的代码如下:

MRC p15, 0, r0, c1, c0, 0 ; Read System Control Register configuration data

ORR r0, r0, #(1             
关注
打赏
1658827356
查看更多评论
0.0462s