ARM中斷處理的安全性與高效性研究
首先假設(shè)初始化代碼中已正確建立了IRQ堆棧。本文引用地址:http://m.butianyuan.cn/article/152438.htm
所有已使能中斷的查詢與服務(wù)>
;將同時(shí)發(fā)生的中斷全部服務(wù),以提高效率
LDMFD SP!,{R0-R3,R12,R14} ;恢復(fù)上下文
在上述保存上下文中沒有必要保存SPSR。因在非嵌套的中斷處理程序中,它不會被任何順序的中斷所破壞。
如果用C語言來書寫該處理程序,可以使用關(guān)鍵字一IRQ來說明,以告訴編譯器實(shí)現(xiàn)如下的操作:
①保存.ATPCS規(guī)定的被破壞的寄存器;
②保存其他中斷處理程序中用到的寄存器;
③同時(shí)將(LR-4)賦予程序計(jì)數(shù)器PC,實(shí)現(xiàn)中斷程序的返回并且恢復(fù)CPSR寄存器的內(nèi)容。
普通中斷處理的C語言程序可以按如下格式編寫:
可見,無論是用C語言還是匯編語言來編寫,它們的工作原理都是一樣的。圖2給出了普通中斷處理過程中,ARM寄存器的保存示意圖(虛線是壓棧保存,實(shí)線是彈?;謴?fù))。圖中與程序處理的步驟相對應(yīng),可以幫助理解處理器上下文的保存過程。
3 任務(wù)切換
有操作系統(tǒng)的嵌入式系統(tǒng)中,中斷的發(fā)生要求保存全部寄存器的內(nèi)容到任務(wù)的棧中,它不是基于安全的考慮是因?yàn)榭赡苤袛鄷?dǎo)致任務(wù)的切換。任務(wù)切換發(fā)生時(shí)所有任務(wù)的寄存器的值都要保存到該任務(wù)的棧中。下個(gè)任務(wù)的上下文將從該任務(wù)棧中得以恢復(fù)到處理器的寄存器中。下面就本問題作出分析并給出實(shí)現(xiàn)的程序代碼。從圖1中斷處理寄存器的保存可知,中斷發(fā)生后任務(wù)的CPSR和PC兩寄存器的值在IRQ模式的SPSR和LR中,所以不能簡單地切換到任務(wù)運(yùn)行的模式中,否則被中斷任務(wù)返回時(shí)的CPSR和PC將不可見(因?yàn)樗鼈儽4嬖贗RQ模式的專用寄存器中,在其他模式中無法操作)。此時(shí),可以考慮設(shè)置一些變量區(qū)作為媒介,將其予以轉(zhuǎn)存到任務(wù)運(yùn)行模式的棧中去。
評論