上一篇中给出了在arm体系架构中[用户态]的寄存器, 共有16个通用寄存器r0-r15和一个通用程序状态寄存器(cpsr).
上一篇中给出了在arm体系架构中[用户态]的寄存器, 共有16个通用寄存器r0-r15和一个通用程序状态寄存器(cpsr).
1.这次接着说通用程序状态寄存器
先看图:
cpsr分为4个域, 每个域8位, 分别是标志域, 状态域, 扩展域和控制域.(图上画的有点错误, 扩展域画大了, mode和I,F,T都是控制域的)
其中标志域表示运算结果的标志. 控制域中, I为1表示屏蔽掉普通中断, F为1表示屏蔽掉快速中断, T为1表示当前为thumb模式.
Mode域表示了当前CPU的处理器模式.
2.处理器模式
不算上最新安全扩展和虚拟化扩展新加上的模式的话, arm架构共有7个处理器模式:
User mode | FIQ mode | IRQ mode | Supervisor (svc) mode |
Abort mode | Undefined mode | System mode |
其中User mode为非特权模式以外, 剩下6个都为特权模式.
当快速中断产生时进入FIQ模式.
当中断产生时进入IRQ模式.
当系统reset或swi(又称svc, 软中断)命令执行时进入svc模式.
当访问内存失败时(分为prefetch abort和data abort)进入Abort模式.
当执行的指令未定义时进入Undefined模式.
是否为特权模式决定了那些寄存器是可用的, 以及cpsr本身的访问权限. 对于特权模式, 对cpsr有完全的访问权限(MSR和MRS指令), 对以非特权模式, 只能读控制域但可读写条件标志域.
3.寄存器
arm架构共有37个寄存器但在不同时刻有20个寄存器是隐藏的(图中阴影部分), 只有当寄存器处于某种特定模式时, 才能访问特定的寄存器(如在abort模式才能访问r13_abt), 另外, 在不同的模式访问cpsr都是同一个, 而spsr_mode用来保存进入特权模式之前的cpsr以便保存异常之前的现场.
usr | sys | svc | abt | und | irq | fiq |
---|---|---|---|---|---|---|
R0 | ||||||
R1 | ||||||
R2 | ||||||
R3 | ||||||
R4 | ||||||
R5 | ||||||
R6 | ||||||
R7 | ||||||
R8 | R8_fiq | |||||
R9 | R9_fiq | |||||
R10 | R10_fiq | |||||
R11 | R11_fiq | |||||
R12 | R12_fiq | |||||
R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq | |
R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq | |
R15 | ||||||
CPSR | ||||||
SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
从wiki上copy的一个寄存器的表格
其实这些东西对于写用户程序的话都是透明的了, 但是有利于理解arm体系架构和看懂一些系统级的代码.
下面想要学一学eabi相关的东西了除了指令集就是这个最重要了.