arm-linux 汇编(3) – 处理器模式 寄存器

上一篇中给出了在arm体系架构中[用户态]的寄存器, 共有16个通用寄存器r0-r15和一个通用程序状态寄存器(cpsr).

上一篇中给出了在arm体系架构中[用户态]的寄存器, 共有16个通用寄存器r0-r15和一个通用程序状态寄存器(cpsr).

1.这次接着说通用程序状态寄存器

先看图:

image_1bl0ld0ga1lkn16khh2rvg1j3a9.png-116.9kB

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以便保存异常之前的现场.

image_1bl0lfomu104c13dd161112p81p89m.png-178.8kB

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相关的东西了除了指令集就是这个最重要了.

Proudly powered by Hexo and Theme by Hacker
© 2021 wastecat