arm指令集和thumb指令集均有切换处理器状态的指令,并可在两种工作状态之间切换,
但arm微处理器首明在开始执行代码时,应该处于arm状态。
进入thumb状态:当 *** 作数寄存器的状态位(位0)为1时,可以采用执行bx指令的方法者销告,
使微处理器从arm状态切换到thumb状态。
此外,当处理器处于thumb状态时发生异常(如irq、fiq、undef、abort、swi等),则异常处理返回时,自动切换到thumb状态。
进入arm状态:当 *** 作数寄存器的状态位为0时,执行bx指令时可以使微处理器从thumb状态切换到arm状态。
此斗碧外,在处理器进行异常处理时,把pc指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,
也可以使处理器切换到arm状态
ARM 内核工作模式的切换是要自己写代码的, 设告雀置CPSR 寄存器低5位进行切换0b10001 快速中断模式
0b10010 中断模式
0b10011 管理模式
0b10111 中止模式
0b11011 未定义
0b11111 系统模式
以下代码就是切换CPU工作模式的示例
********** Begin init stact ***********/
在6种模式下切换并设置堆栈指针
MRS R0,CPSR 把CPSR读取到R0
BIC R0,#0x1f 低5位清零
LDR R1,=MODE_Fiq 设置R1 为0b10001
ORR R0,R0,R1R0和R1相或,设置低5位
MSR CPSR_c,R0 把R0的值重唤友纳新赋值到CPSR
LDR SP,=Stact_Fiq
BIC R0,#0x1f 低5位清零
LDR R1,=MODE_Irq
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Irq
BIC R0,#0x1f 低5位清零
LDR R1,=MODE_Svc
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Svc
BIC R0,#0x1f 低5位清零
LDR R1,=MODE_Abort
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Abort
BIC R0,#0x1f 低5位清零
LDR R1,=MODE_Undef
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Undef
BIC R0,#0x1f 低5位清零和没
LDR R1,=MODE_Sys
ORR R0,R0,R1
MSR CPSR_c,R0
LDR SP,=Stact_Sys
1、ARM处理器各个模式之间是如何切换的?答:除用户模式外的其他6种模式称为特权模式,这些模式中,程序可以访问所有系统资源,也可以任意进行处理器模式的切换。处理器模式可以通过软件控制进行切换(直接设置CPSR寄存器的后五位就可以在6种特权模式之间互相切换),也可以通过外部中断或异常处理过程进行切换(例如,在桐散USR模式下,发生中断后切换到IRQ模式)。
2、ARM各个模式之间切换时,上下文的保存哪些是硬件在做?哪些是 *** 作系统在做?
答:CPU做的:
(1)把返回地址保存到相圆轮敏应模式的lr寄存器中,例如从usr模式切换到irq模式,CPU会将usr模式下的pc值,保存到irq模式下的lr寄存器中。
(2)保存CPSR到相应模式的SPSR寄存器中,还是上面的例子,CPU保存usr模式下的CPSR到irq模式下的SPSR中。
(3)将pc设置成相应模式下的某地址值继续执行。
*** 作系统做的(以从模式A切换到模式B为例):
*** 作系统所做内容需要根据情况而定,因为模式切换不橘枝一定伴随着进程之间的切换,有可能从A模式切换到B模式后,CPU执行的是同一个进程,这时不需要 *** 作系统具体做什么。
当模式切换伴随着进程切换时, *** 作系统需要保存模式切换之前的上下文环境。也就是进程控制块,进程控制块包括标识符、用户可见寄存器、控制和状态寄存器、栈指针等等,这与普通的进程切换类似。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)