ARM基础知识(6.16)
一 ARM工作模式
u(usr) s(sys) a(abt) u(udf) f(fiq) i(irq) s(svc) m(mon)
非特权状态对应于'usr'状态,
权限状态则由其他状态构成,
异常状态包括多种类型:abt、udf、fiq、irq和svc,
安全监控机制被指定为'mon'。
权限模式特点:它能够获取ARM核内部受限的资源,并且另外一种方式是转换到其他模式。
二 ARM寄存器资源
(1) r0至r12:通用寄存器
(2) SP寄存器(sp):用于指示被压入栈的数据的位置
(3) LR寄存器(lr):在代码跳转时保存PC值以便返回[lr←→pc]
(4) PC寄存器(pc):程序计数寄存器告诉处理器下一步需要执行哪个指令
(6) 状态字(CPSR):反映当前处理器的工作状态
7位/字节/ nibble/ bit: N Z C V | .... | I F T | mode
mode : 当前所处的工作模式
T : 表示系统处于拇指模式(数值为1)或臂部模式(数值为0)
F : 表明设备已启用的状态(数值为"0")或禁用的状态(数值为"1")
I : 反映设备处于启用状态(数值"0")或禁用状态(数值"1")
N : 设置标志位为"1"的条件是当前运算结果呈现负值
Z : 设置标志位仅在当前运算结果等于零时生效
C : 标志位设为"1"表明相加运算产生了进位或者相减未产生借位
V : 标志位被设置当且仅当两个正数相加导致符号溢出
(6)SPSR : 当异常产生的时候,保存CPSR的值,便于恢复现场
(7)用于所有模式的寄存器包括: r0 至r7 、程序计数器(PC)以及控制状态寄存器(CPSR)。
(8)FIQ模态仅限于r8 至r_{\text{I2}} 。
(9)用户与系统共同使用的寄存器是r_{\text{I3}} 和r_{\text{I4}} 。
(IO)异常模态由sps_r 配置。
(I I)MON模态 exclusive地分配了寄存器组: r6 至r7 以及sps_r 。
请注意:共享寄存器在使用时必须先将它的原有数据进行保存。使用后需立即恢复其原有数据。
当异常发生时,在三 ARM 核中会自主执行一系列处理步骤以应对这些异常情况。
首先切换至 ARM 状态;然后根据具体情况进入指定的异常模式;最后可选择关闭相关中断(若需)。
随后,在相应的 lr 寄存器中存储程序计数器 pc 的值。
最后将 pc 指令指向对应的系统返回向量空间以完成任务。
程序需完成的任务如下:
[1] 编写一段内存空间,并存储一些跳转指令。
[2] 通知ARM内核并告知异常向量表的具体存放位置。
<1> ARM7/ARM9/ARM11 异常向量表可存储于以下地址: [H] 末位寻址的全局段中的特定偏移位置。
<2> 对于cortex-A系列处理器而言,在不同配置下该内存空间的位置会有所变化:
- 基线配置下,默认设置为 [H] 的初始位置。
- 而针对不同型号的cortex-A系列处理器,则应根据其协处理器cp15的c12寄存器当前的状态来确定具体存放位置。
特别提示:_ARM内核优先搜索指定地址范围内的异常向量表。
[3] 实现相应的错误处理机制。
注意: 异常处理函数应承担的任务包括以下几点: 首先需保存共享寄存器的状态; 其次应对发生异常的情况; 最后需将执行环境归位。具体操作如下: (1) 重新加载之前的状态信息; (2) 将lr寄存器的状态转移至程序计数器; (3) 复制spsr字段至cpsr字段。
