裸机第七弹——ARM工作模式 & PSR简介 & 堆栈初始化
参与Helper2416开发板助学计划心得
简述ARM9的七种工作模式
1:用户模式(usr):ARM处理器正常的程序执行状态。
2:系统模式(sys):运行具有特权的操作系统任务。
3:管理模式(svc):操作系统使用的保护模式。
4:数据访问终止模式(sbt):当数据或指令预取终止时进入该模式,可用于与你存储及储存保护。
5:未定义指令终止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
6:中断模式(irq):用于通用的中断处理。
7:快速中断模式(fiq):用于高速数据传输或通道处理。
不同的模式可以通过软件来相互切换,或者发生各类中断和异常时处理器自动进入相应的模式
如上图所示:除usr模式以外的六种模式都属于特权模式,进入特权模式是为了处理中断、异常,或者访问被系统保护的资源,其实在操作系统下大部分程序是运行在usr模式下的。而对于特权模式中除sys模式以外的五种模式又被称为一场模式,顾名思义,就是处理各种异常的,一旦异常发生,处理器便会自动进入相应的异常模式。
需要说明的是:中断本身也就是一种异常
另外,ARM9同时还有两种工作状态。
1:ARM状态:执行32位的word(4Byte)对齐的ARM指令。
2:Thumb状态:执行16位的halfword(2Byte)对齐的Thumb指令。
注意:处理器上电后便是svc模式ARM状态,Thumb模式基本用不到,我们就不用管他的工作状态了。
如上图所示:
在ARM状态下,每种工作模式都用16个通用寄存器(图中对应模式下的那一列寄存器R0-R15)其中带三角的是该模式下所特有的,具有实际存在,没带三角的就是各个模式所通用的(只有一个实际存在),其中R13作为SP、R14作为LR、R15作为PC。
每种模式除了这16个通用寄存器外,还有一个程序状态寄存器Current Program Status Register(CPSR),另外,五个异常模式下还有一个Saved Program Status Register(SPSR)用于保存模式切换前CPSR的值。
PSR简介
1:工作模式位:
指明CPU当前处于什么模式。可以编写这些位,使CPU进入指定的工作模式。
2:T标志位:
指明当前是处于ARM模式还是Thumb模式
3:中断禁止位:
A、I、F中断禁止位
4:条件标志位与ARM条件码的关系:
堆栈初始化
在实际使用中,我们都会用C开发,这就需要我们初始化好堆栈,由于各种工作模式中都有自己的SP寄存器,我们需要为每种工作模式(暂且将usr和sys模式看作一个模式)都设置好堆栈,
实现:
由于各种模式下的SP寄存器只能其对应的模式下才能被访问,所以我们需要先通过修改CPSR的值进入相应的模式,再设置他的堆栈,需要注意的是,CPSR中的工作模式位只能在特权模式下才能被修改。示例如下:
- @
- @ Set up the Stack for Undefined mode
- @
- LDR r0, =_stack @ Read the stack address
- MSR cpsr_c, #MODE_UND|I_F_BIT @ switch to undef mode
- MOV sp,r0 @ write the stack pointer
- SUB r0, r0, #UND_STACK_SIZE @ give stack space
- @
- @ Set up the Stack for abort mode
- @
- MSR cpsr_c, #MODE_ABT|I_F_BIT @ Change to abort mode
- MOV sp, r0 @ write the stack pointer
- SUB r0,r0, #ABT_STACK_SIZE @ give stack space
- @
- @ Set up the Stack for FIQ mode
- @
- MSR cpsr_c, #MODE_FIQ|I_F_BIT @ change to FIQ mode
- MOV sp,r0 @ write the stack pointer
- SUB r0,r0, #FIQ_STACK_SIZE @ give stack space
- @
- @ Set up the Stack for IRQ mode
- @
- MSR cpsr_c, #MODE_IRQ|I_F_BIT @ change to IRQ mode
- MOV sp,r0 @ write the stack pointer
- SUB r0,r0, #IRQ_STACK_SIZE @ give stack space
- @
- @ Set up the Stack for SVC mode
- @
- MSR cpsr_c, #MODE_SVC|I_F_BIT @ change to SVC mode
- MOV sp,r0 @ write the stack pointer
- SUB r0,r0, #SVC_STACK_SIZE @ give stack space
- @
- @ Set up the Stack for USer/System mode
- @
- MSR cpsr_c, #MODE_SYS|I_F_BIT @ change to system mode
- MOV sp,r0 @ write the stack pointer
复制代码
论坛ID:yuanlai2010
发表时间:2014-07-22