arm-linux 汇编(3) – 处理器模式 寄存器
blog 归档 arm-linux 汇编 系统编程
上一篇中给出了在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以便保存异常之前的现场.
Registers across CPU modes
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相关的东西了除了指令集就是这个最重要了.