看过"ARM微处理器的编程模型"之后,得知:
ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作:
1)保存处理器当前状态、中断屏蔽位以及各条件标志位;
2)设置当前程序状态寄存器CPSR中相应的位;
3)将寄存器lr_mode设置成返回地址;
4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
在接收到中断请求以后, ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。
从异常中断处理程序中返回包括下面两个基本操作:
1)恢复被屏蔽的程序的处理器状态;
2)返回到发生异常中断的指令的下一条指令处继续执行。
请问:
1.以上这些操作是不是就是由ARM处理器自动完成,不需要程序来实现,还是其它?
2.我看到uclinux在处理异常时,做了保护状态寄存器,返回地址等操作,这样的话,不就是应该在程序中来实现以上操作了吗?(代码如下)
vector_IRQ: @
@ save mode specific registers
@
ldr r13, .LCsirq
sub lr, lr, #4
str lr, [r13] @ save lr_IRQ //保存返回地址lr_IRQ
mrs lr, spsr
str lr, [r13, #4] @ save spsr_IRQ //保存中断时的机器状态spsr_IRQ
@
@ now branch to the relevent MODE handling routine
@
//有两种模式下产生中断:svc和user,即管理模式和用户模式
mrs r13, spsr @ switch to SVC_32 mode
bic r13, r13, #MODE_MASK @ preserve F and T bits //保护FIQ
orr r13, r13, #MODE_SVC|I_BIT //禁止IRQ中断
msr spsr_c, r13 @ switch to SVC_32 mode //切换到svc中断模式下
//计算入口地址,保存到lr寄存器中
and lr, lr, #15 //lr=spsr,lr=spsr&0x0f 获得状态寄存器的低4位【0-3】0x0f
ldr lr, [pc, lr, lsl #2] //lr=pc+lr<<2 lr=0或者8 0x10用户 0x11快速中断 0x12中断 0x13管理
//根据cpu模式跳转到相应模式的入口
movs pc, lr @ Changes mode and branches
3.在linux中,对于发生异常后,在程序中究竟应该做一些哪些操作呢?比如切换处理器的模式?为什么在发生IRQ中断后,必须把CPU切换成SVC模式呢,当时不是已经是IRQ模式呢?
请大家帮帮忙,谢谢了!
如果你认为问题中还有没描述清楚的地方,请指出来,我会尽快补上。