@
目录
ARMV8系统级编程模型主要包括异常级别、运行状态、安全状态、同步异常、异步异常、DEBUG等。本文主要对系统级编程模型做一个概要介绍。
1. 典型的Exception Level使用模型
异常级别 | 运行的软件 |
---|---|
EL0 | Secure or Non-secure application |
EL1 | Secure or Non-secure OS |
EL2 | Hypervisor (可以理解为上面跑多个虚拟OS) |
EL3 | Secure Monitor(ARM Trusted Firmware) |
2.异常相关术语
术语 | 说明 |
---|---|
Taking an exception | PE第一次回应一个异常,此时PE state称为taken from, 之后PE状态为taken to |
Returning from exception | 当异常返回指令被提交运行,PE state就是return from exception |
异常级别 | 不同异常级别优先级不同,如EL3的异常高于EL1的异常 |
精准异常(precise exception) | 找到某条指令,这条指令前的所有指令都执行完毕,这条指令之后的所有指令都未执行(执行的需要回退),这样PE状态就被记录下载,异常处理完成后就可以恢复。除了SError irq 之外,其它的都是精准异常 |
同步异常(synchronous exception ) | (1)异常的产生是和cpu core执行的指令或者试图执行相关 (2)硬件提供给handler的返回地址就是产生异常的那一条指令所在的地址 (3)synchronous exception又可以细分成两个类别: ??a) 一种我们称之为synchronous abort,例如未定义的指令、data abort、prefetch instruction abort、SP未对齐异常,debug exception等等; ??b) 另一种是正常指令执行造成的,包括SVC/HVC/SMC指令,这些指令的使命就是产生异常。 |
异步异常(asynchronousexception ) | asynchronous exception基本上可以类似大家平常说的中断,它是毫无预警的,丝毫不考虑cpu core感受的外部事件(需要注意的是:外部并不是表示外设,这里的外部是针对cpu core而言,有些中断是来自SOC的其他HW block,例如GIC,这时候,对于processor或者cpu(指soc)而言,这些事件是内部的),这些事件打断了cpu core对当前软件的执行,因此称之interrupt。interrupt或者说asynchronous exception有下面的特点: (1)异常和CPU执行的指令无关。 (2)返回地址是硬件保存下来并提供给handler,以便进行异常返回现场的处理。这个返回地址并非产生异常时的指令。 根据这个定义IRQ、FIQ和SError interrupt属于asynchronous exception。 |
SError interrupt | SError interrupt是发生了external abort导致的异步异常(或称中断)。 external abort来自memory system, 是访问外部memory system产生的异常(当然不是所有的来自memory system的abort都是external abort,例如来自MMU的abort就不是external abort,这里的external是针对processor而非cpu core而言,因此MMU实际上是internal的)。external abort发生在processor通过bus访问memory的时候(可能是直接对某个地址的读或者写,也可能是取指令导致的memory access),processor在bus上发起一次transaction,在这个过程中发生了abort,abort来自processor之外的memory block、device block或者interconnection block,用来告知processor,搞不定了,你自己看着办吧。external abort可以被实现成synchronous exception(precise exception),也可以实现成asynchronous exception(imprecise exception)。如果external abort是asynchronous的,那么它可以通过SError interrupt来通知cpu core |
3. Execution State
3.1 两种Execution State
??ARMv8 提供AArch32 state和 AArch64 state 两种Execution State,下表是两种Execution State对比:
Execution State | 说明 |
---|---|
AArch32 | 提供13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14) |
提供一个32bit异常链接寄存器ELR, 用于Hyp mode下的异常返回 | |
提供32个64bit SIMD向量和标量floating-point支持 | |
提供两个指令集A32(32bit)、T32(16/32bit) | |
兼容ARMv7的异常模型 | |
协处理器只支持CP10\CP11\CP14\CP15 | |
AArch64 | 提供31个64bit通用寄存器X0-X30(W0-W30),其中X30是程序链接寄存器LR |
提供一个64bit PC指针、堆栈指针SPx 、异常链接寄存器ELRx | |
提供32个128bit SIMD向量和标量floating-point支持 | |
定义ARMv8异常等级ELx(x<4),x越大等级越高,权限越大) | |
定义一组PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息 | |
没有协处理器概念 |
3.2 决定Execution State的寄存器
寄存器及bit位 | 说明 |
---|---|
SPSR_EL1.M[4], Saved Program Status Register (EL1) | 决定EL0的执行状态: (1) 0b1 :AArch32 execution state (2) 其它 :AArch64 execution state |
HCR_ |
首页 上一页 1 2 下一页 尾页 1/2/2 | |
【大 中 小】【打印】 【繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部】 | |
上一篇:内核常用的might_sleep函数 | 下一篇:KEIL5、STM32CubeMX、STM32CubeID.. |