arm中system模式的作用

来源:互联网 发布:淘宝促销文案范文 编辑:程序博客网 时间:2024/06/12 21:38

这几天学了很多arm细节知识,个人平时实在没有深入进去
交了钱被人逼着学才会努力深究,真是贱

以前就知道arm有7种基本工作模式
FIQ 、IRQ由中断进入
UNDEF、ABORT 由程序异常进入
SVC由上电和软中断进入
user由SVC处理程序主动进入
但是还有一个system,使用和user相同的寄存器,但是又没有SPSR,同时还能执行特权指令
这么一个另类,OS把它当user用不安全,当异常和中断,又没有自动进入方式
怎么看怎么别扭,当然这也是领悟之后才意识到的,system是用来解决arm中中断可重入问题的
搜了一下,网上的关于arm可重入中断的解释只有1篇,而且没有考虑完全http://blog.chinaunix.net/u1/58640/showart_513501.html
默认的中断处理函数都会自己先主动把lr压栈先,此文没有考虑这一点,把破坏想的严重了
这样的理论知识实践中几乎没有用到,唯有追求专业的人士才会深究,这样就能满足特殊要求,做到一般人做不到的事情

首先,armcc关键字__irq不能用来编写可重入中断
当中断可重入时,在中断处理函数中使用 BL 调用子函数,这时候问题就来了,分两种情况
如果子函数不是__irq 方式申明的,没有自己压栈lr的习惯,那么此时再来一个irq中断,lr_irq就被新值冲掉
,从此陷入一个死循环。
如果子函数是会主动压栈lr的好孩子,那么仅仅在执行压栈lr的这条指令时,发生irq中断才会导致上述问题,但是触发问题的条件就变得很苛刻了

所以,这时候就需要system模式来拯救世界了
编写可重入中断必须借助以下汇编代码
IRQHandler
;LR_IRQ ,SPSR_IRQ,r12压栈,避免下一个IRQ中断将其冲掉
sub lr,lr,#4
stmfd sp!,{lr}
mrs r14,spsr
STMFD sp!,{r12,r14}
;读、清中断控制器中断源
;省略相关代码
mov r12,#IntBase
LDR r12,[r12,#IntSource]
;切换到system模式,同时使能IRQ
mrs r14,cpsr
bic r14,r14,#0x9f
orr r14,r14,#0x1f
msr CPSR_c,r14
;保存r0-r3,LR_user到user栈中,然后调用c子程序,中断源r0最为一个参数传进c处理函数
BL C_irq_handler ;看名字,就知道这个c程序是__irq形式申明的
;是一个会自己压栈LR的好孩子
LDMFD sp!,{r0-r3,lr}
;切换到IRQ模式同时禁止IRQ
mrs r12,cpsr
bic r12,r12,#0x1f
orr r12,r12,#0x92
msr CPSR_c,r12
;恢复LR_irq,SPSR_irq和工作寄存器r12,然后退出IRQ
LDMFD sp!,{r12,r14}
msr SPSR_csxf,r14
LDMFD sp!,{PC}^
3

原创粉丝点击