2009年2月26日 星期四

ARM的例外事件處理和管線的關係

當例外發生時,處理器會負責如下的動作
1. 拷貝CPSR到對應例外處理模式的SPSR
2. 改變CPSR到對應的例外處理模式,以及對應處理模式的暫存器群,
    任何例外處理都會disable IRQ位元,在FIQ和RESET的例外發生時,才會disable FIQ位元
3. 拷貝PC(r15)到對應處理模式的LR(r14)
4. 設定PC(r15)到對應中斷向量的位址



SWI和Undefined instruction的例外事件:
這兩種例外,都是執行指令所引起的,且都是在PC(r15)沒有更新前,去處理例外事件,所以回到原來的執行程序時,需要執行下一個的指令,因為前一個指令,就是呼叫例外處理程式處理
(for undefined instruction:這個例外事件程式可以當作發展自有命令的模擬開發方式)
the return instruction is:
MOVS pc, lr
The handler entry and exit code to stack the return address and pop it on return is:
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^


prefetch abort的例外事件:
若fetch的指令為無效的位址,在fetch的階段就會標記這個指令,不過要等到Execute階段才會去處理例外事件,這時這個例外事件可能透過MMU對應vitrual memory locations到正確的physical memory,也許還有physical memory和儲存設備之間的swap動作...
PS:在Execute階段處理例外事件時,pc(r15)還未更新
然後回到原來程序時,應該跳回到原來的指令,這時就可以正確fetch這個位址的指令,所以
the return instruction is:
SUBS pc,lr, #4
The handler entry and exit code to stack the return address and pop it on return is:
SUB lr,lr,#4
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^



FIQ和IRQ的例外事件:
在執行完指令完且更新PC(r15)後,會檢查IRQ及FIQ的腳位是否為Low,若成立則處理例外事件,所以回到原來的執行程序時,需要執行下一個的指令,因為前一個指令,已經執行過了
the return instruction is:
SUBS  pc, lr, #4
The handler entry and exit code to stack the return address and pop it on return is:
SUB lr,lr,#4
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^

data abort的例外事件:
在執行load或store的相關指令時,執行完且更新PC(r15)後,才會發生data abort的例外事件,這時這個例外事件可能透過MMU對應vitrual memory locations到正確的physical memory,也許還有physical memory和儲存設備之間的swap動作...
所以回到原來程序時,應該跳回到原來的指令,然後就可以正確load或stroe這個位址的資料,所以
the return instruction is:
SUBS pc, lr, #8
The handler entry and exit code to stack the return address and pop it on return is:
SUB lr,lr,#8
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^

    似乎這些例外處理的返回位址計算,應該是CPU的責任,不過當年ARM CPU的其中一個主要訴求,就是很小的晶片面積,所以就不浪費邏輯閘,讓軟體來處理這些動作,或者說讓軟體開發者有更大的彈性...
    目前有接觸過ARM 7,擁有三階的管線(Fetch. Decode. Execute),之後更強大的ARM系列的CPU,有提供5階或更多的管線,不知道例外處理返回位址的計算,是不是不同???(有機會碰到在看看)
    雖然這兩張圖用來代表管線處理指令流的示意,也許有不恰當的地方,不過我喜歡這樣的描述方式來記憶返回位址的計算,重點是例外發生時,PC(r15)是否有更新,以及各種例外對於返回後,處理的需求,就可以推論返回位址的計算

相關連結:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0040d/index.html 第九章相關內容
http://infocenter.arm.com/help/topic/com.arm.doc.dui0040d/DUI0040D.pdf ,pdf文件下載