在arm v4以後的版本裡,arm核都有7中工作模式:user, fiq, irq, supervisor, abort, undefined,和system。這7中processor mode又分為3類:user mode, privileged mode和system mode。對於system mode的作用一直有些模糊,今天在arm的**上找到了乙份說明文件,對這個問題的解析很到位,特記錄如下:
5.12. system mode就不逐字翻譯了,大體意思如下:
當處理器異常出現時,當前程式計數器(也就是pc+offset,offset與異常種類相關)會被拷貝的相應異常模式的lr,cpsr也會被拷貝到相應異常模式的spsr。然後cpsr會被設定為相應的異常模式, pc被設定到對應異常的入口處執行其處理函式。(上面這些都是arm核自動操作的)
arm的子程式轉移指令bl會在改變pc前將返回位址放到lr中,所以從子程式返回時可以把r14放到pc來操作。如mov pc, lr。
所有上面的動作都暗示了如果異常處理函式會呼叫子程式(使用bl),那麼各異常模式都必須保證異常處理函式執行的過程中不能出現同樣的異常,因為子函式的返回位址會被異常的返回位址覆蓋掉。(在早期的arm版本中,可以通過禁止異常處理函式呼叫子函式或者切換處理模式到user模式來解決這個問題。第一種方式過於嚴格,而第二種方式可以會由於user模式缺少相應的許可權而不能執行某些動作)。
為此,arm v4及之後的版本提供了system mode這樣一種處理器模式來解決這個問題。system mode是一種privileged的模式,而且共用user模式的所有暫存器。privileged模式的程式可以執行在這個模式,而不用但是處理器異常會擦除lr。
注意:system mode不是因為發生了某種異常處理器自動進入的模式,而是異常處理函式通過修改cpsr來進入的。
應該說這段資料還是解釋了很多東西的,希望對大家有所幫助。
慚愧的是自己並沒有考慮到異常處理函式中lr會被覆蓋這種情況。。。
ARM的系統模式(system mode)
在arm v4以後的版本裡,arm核都有7中工作模式 user,fiq,irq,supervisor,abort,undefined,和system。這7中processor mode又分為3類 user mode,privileged mode和system mode。對於system mode的...
ARM工作模式
從程式設計的角度看,arm微處理器的工作狀態有兩種,並可在兩種狀態之間切換 1 arm狀態,此時處理器執行32位的字對齊的arm指令 2 thumb狀態,此時處理器執行16位的,半字對齊的thumb指令 為了相容老晶元 在程式執行的過程中,可以在兩種狀態之間進行相應的轉換。處理器工作狀態的轉變並不影...
arm工作模式
從程式設計的角度看,arm微處理器的工作狀態有兩種,並可在兩種狀態之間切換 1 arm狀態,此時處理器執行32位的字對齊的arm指令 2 thumb狀態,此時處理器執行16位的,半字對齊的thumb指令 為了相容老晶元 在程式執行的過程中,可以在兩種狀態之間進行相應的轉換。處理器工作狀態的轉變並不影...