8.ARM工作模式和暫存器及異常

Rston發表於2016-03-27

8.1.ARM程式設計模式和工作模式
(1)ARM的基本設定:ARM約定Byte(8bits)、Halfworld(16bits,2byte)、World(32bits,4byte)。大部分ARM的CPU提供指令集:Thumb指令集(16bit,所有的指令集是16位的,優點是能節省記憶體;缺點是指令集不健全,譬如異常處理需要兩條16位的指令去完成某件事,程式設計複雜需要來回切換ARM狀態和Thumb狀態)、ARM指令集(32bit,所有的指令集是32位的,好處是程式設計簡單;缺點是浪費記憶體)、Thumb2指令集(16&32bit,指令集有16位和32位的,ARMv7的時候推出,S5PV210使用的是該指令集,等於ARM指令集和Thumb指令集的集合)。Jazelle cores支援Java bytecode,用於提供Java加速。
(2)ARM處理器工作模式:User(非特權模式,大部分任務執行在這種模式);System(使用和User模式相同暫存器集的特權模式);FIQ(當一個高優先順序(fast) 中斷產生時將會進入這種模式);IRQ(當一個低優先順序(normal) 中斷產生時將會進入這種模式);Supervisor(當復位或軟中斷指令執行時將會進入這種模式);Abort(當存取異常時將會進入這種模式); Undef(當執行未定義指令時會進入這種模式)。
(3)注意:除User(使用者模式)是Normal(普通模式)外,其他6種都是Privilege(特權模式)。Privilege中除Sys模式外,其餘5種為異常模式。各種模式的切換,可以是程式設計師通過程式碼主動切換(通過寫CPSR暫存器);也可以是CPU在某些情況下自動切換。各種模式下的許可權和可以訪問的暫存器不同。
(4)CPU是硬體,OS是軟體,軟體的設計要依賴硬體的特性,硬體的設計要考慮軟體需要,便於實現軟體特性。作業系統有安全級別要求,因此CPU設計多種模式是為了方便作業系統的多種角色安全等級需要。


8.2.ARM的37個暫存器詳解
(1)ARM總共有37個暫存器,但是每種模式下最多隻能看到18個暫存器,其它暫存器雖然名字相同但是在當前模式不可見。譬如對r13這個名字來說,在ARM中共有6個名叫r13(又叫sp)的暫存器,但是在每種特定處理器模式下,只有一個r13是當前可見的,其它的r13必須切換到它的對應模式下才能看到,該種設計叫影子暫存器(banked register),影子暫存器設計的優點是當各種異常發生的時候,每種異常模式都可以儲存一些重要的資料,使異常處理程式完成之後返回異常前的程式時不會破壞原有的暫存器或狀態。
(2)ARM共有37個暫存器,都是32位長度;37個暫存器中30個為”通用”型,1個固定用作PC,1個固定用作CPSR,5個固定用作5種異常模式下的SPSR(見圖1)。
(3)CPSR暫存器:CPSR中各個bit位表明了CPU的某些狀態資訊,這些資訊非常重要,和後面學到的彙編指令息息相關(譬如BLE指令中的E就和CPSR中的Z標誌位有關);CPSR中的I、F位和開中斷、關中斷有關;CPSR中的mode位(bit4~bit0共5位)決定了CPU的工作模式,在uboot程式碼中會使用匯編進行設定(見圖2)。
(4)PC(r15)程式控制暫存器:PC(Program control register)為程式指標,PC指向哪裡,CPU就會執行哪條指令(所以程式跳轉時就是把目標地址程式碼放到PC中);整個CPU中只有1個PC(CPSR也只有1個,但SPSR有5個)。


8.3.ARM的異常處理方式
(1)異常:正常工作之外的流程都叫異常,異常會打斷正在執行的工作,並且一般我們希望異常處理完成後繼續回來執行原來的工作(儲存現場),中斷是異常的一種。
(2)異常向量表:所有的CPU都有異常向量表,這是CPU設計時就設定好的,是硬體決定的;當異常發生時,CPU會自動動作(PC跳轉到異常向量處處理異常,有時伴有一些輔助動作);異常向量表是硬體向軟體提供的處理異常的支援(見圖3)。
(3)ARM異常處理機制:異常處理中有一些是硬體自動做的,有一些是程式設計師需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何寫程式碼。CPU設計時提供的異常向量表一般為一級向量表,有些CPU為了支援多箇中斷,還會提供二級中斷向量表,處理思路類似於這裡說的一級中斷向量表(見圖3)。


這裡寫圖片描述


這裡寫圖片描述


這裡寫圖片描述


相關文章