1. 程式人生 > >ARM Cortex-A8 的學習筆記(2)——ARM暫存器

ARM Cortex-A8 的學習筆記(2)——ARM暫存器

        上一篇介紹了關於學習ARM的開發環境以及工程檔案編譯過程,今天,學習了關於ARM的CPU工作模式以及ARM暫存器部分,現整理一下筆記。

一、ARM指令集與Thumb指令集

       ARM指令集的指令是32位的,但為了相容16位資料匯流排的應用系統和解決程式碼密度問題而提出了16位的Thumb指令集。程式碼密度就是單位儲存空間中包含的指令的個數。就例如1k的儲存空間能裝32條ARM指令,但能裝64條Thumb指令。所以,Thumb指令集可以大大節省了系統的儲存空間

       但Thumb不是一個完整的體系結構,它不能實現ARM指令的全部功能,它必須要藉助於ARM指令集。因此,執行程式時,需要ARM工作狀態與Thumb 工作狀態之間進行切換。後來,推出了Thumb-2指令集

改善了Thumb的效能,添加了一些32位的Thumb指令用來解決Thumb功能不全的問題。現Thumb-2已經可以實現ARM指令集的所有功能,不必再進行ARM與Thumb工作狀態的切換。所有Cortex-A 系列都支援Thumb-2技術。

二、ARM CPU處理器模式

        ARM架構有9種處理器模式,其中有8種特權模式1種非特權模式的使用者模式。(見下圖)


         (1)使用者模式下只能執行一般的指令,不能訪問受作業系統保護的資源。例如不能訪問硬體,不能訪問受保護的記憶體,不能訪問受保護的資料等等。而特權模式下,可以訪問所有系統資源而且可以進行直接模式切換。所有應用程式都只能在使用者模式進行,而且不能直接進行模式切換

。如果應用程式需要進行特殊訪問,則這時應用程式需產生異常處理,請求作業系統替它完成任務,這時,作業系統把使用者模式切換成特權模式,進行任務,完成後切換回使用者模式繼續執行應用程式。這樣的體系結構能使作業系統能控制整個系統的資源。

        (2) 處理器模式可以通過軟體控制切換,外部中斷異常處理過程切換。

         (3)下面簡單介紹一下幾個常見的模式:

                  FIQ模式:快速中斷模式,當一個高優先順序中斷產生時進入該模式,一般用於高速資料傳輸以及通道處理。

                  IRQ模式:外部中斷模式,當一個低優先順序中斷產生時進入該模式,一般用於通常中斷處理。

                 Svc模式:特權模式,當處理器復位引腳有效時,進入該模式,程式跳轉到復位異常中斷處理程式處執行。復位異常中斷通常  用於系統上電和系統復位兩種情況。還有軟中斷指令執行時,也進入該模式。軟中斷是通過一條具體指令SWI,引發中斷操作,實現從使用者模式切換到特權模式並執行特權程式。

                 SYS模式:系統模式,該模式不是異常處理進入,並且與使用者模式具有完全一樣的暫存器,用於執行作業系統的特權任務,這樣可以保證在異常發生時,維持作業系統的執行的特權任務能夠正常執行。

                  ABT模式:資料訪問終止模式,當資料訪問的目標地址不存在或不允許時, 儲存器就發出資料中止訊號,處理器接收到訊號進入該模式。

                Undef模式:未定義指令中止模式:未定義異常就是記憶體中的程式指令處理器識別不了,這時進入該模式。未定義指令異常可用於在沒有物理協處理器的系統上,對協處理器進行軟體模擬,或通過軟體模擬實現指令集擴充套件。為了更好的理解這個模式,先簡單引入協處理器的這個概念。協處理器是一種晶片,用於減輕系統微處理器的特定處理任務。最常使用的協處理器是用於控制片上功能的系統協處理器,例如快取記憶體儲存器管理單元等。舉個例子,在有浮點運算系統中,程式要進行浮點運算,ARM向協處理器發出指令,浮點協處理器收到指令會返回一個應答訊號,ARM收到應答訊號,繼續執行程式。如果在沒有浮點運算系統中,ARM沒有收到應答訊號,那就認為沒有相應的物理協處理器,就產生未定義指令異常,可通過軟體模擬硬體操作,可用浮點運算軟體模擬包來支援浮點運算。

三、各個cpu模式的暫存器

       ARM 處理器共有37個暫存器,其中包括31個通用暫存器,6個狀態暫存器。(都是32位暫存器)

      每一種異常模式都有一組專用暫存器。當應用程式發生異常中斷時,可以保證在進入異常模式時使用者模式的暫存器不被破壞。

      

           1.R0~R12 是通用暫存器,放通用資料,各個模式的R0~R12是與USR模式共享(除了FIQ,R8-R12)。注意:Thumb指令集下只能訪問R0~R7低暫存器。

           2.R13(SP):堆疊指標暫存器,每一種異常模式都有其自己獨立的r13,指向各模式所對應的專用堆疊,這表明ARM處理器允許使用者程式有6個堆疊空間。

           3.R14(LP):連線暫存器,儲存子程式返回地址,跳轉指令會自動把返回地址放入R14,子程式把R14複製到PC實現返回。將r14入棧可以處理巢狀中斷。

           4.R15(PC):程式計數器指令分為三個階段執行(取指,譯碼,執行)。PC計數器總是指向取指的指令,不是譯碼不是執行的指令。ARM每條指令4個位元組(32位),所以PC的值=當前程式執行位置+8位元組。

           5.APSR/CPSR:應用程式狀態暫存器(使用者模式下)/當前程式狀態暫存器(特權模式下),該暫存器就是用來儲存一些關於運算的資訊,包括,條件標誌位、中斷禁止位、當前處理器模式標誌和控制狀態位等

       N - ALU負數       Z - ALU零位     C - ALU進位操作    V - ALU操作溢位    Q - 指示增強的DSP運算指令是否發生了溢位  

       J - 是否Jazelle狀態       GE[3:0] - SIMD指令使用         IT[7:2] - Thumb-2指令的if...then...條件執行   

       E - 操作儲存的位元組順序(大端模式、小端模式)       A - 是否禁止非同步abort              I - 是否禁止IRQ       

       F - 是否禁止FRQ         T - 是否使用Thumb指令集        M[4:0] - 當前cpu模式編碼

            6.SPSR:已儲存程式狀態暫存器這個暫存器用於存放當前程式狀態暫存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。由於使用者模式和系統模式不是異常中斷模式,所以USR沒有SPSR

以上是我學習後整理的一些筆記,如果有任何錯誤,請各位大神指教。