8.ARM工作模式和暫存器及異常
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)。
相關文章
- 6.常見暫存器和指令
- CS 暫存器 和 IP 暫存器
- STM32 GPIO的8種工作模式及相關配置暫存器模式
- Git工作區和暫存區Git
- 暫存器定址和暫存器間接定址的區別
- CS、IP和PC暫存器
- 暫存器
- PC暫存器
- 函式呼叫暫存器及棧幀結構函式
- git 工作流程以及Git 工作區、暫存區和版本庫(筆記)Git筆記
- 【第四篇】-Git 工作區暫存區和版本庫Git
- 迭代器和異常處理
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- 異常和異常呼叫鏈
- 組合語言學習筆記03——暫存器(CPU工作原理)組合語言筆記
- restframework 異常處理及自定義異常RESTFramework
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- 儲存過程——異常捕獲&列印異常資訊儲存過程
- 異常及捕獲
- 暫存
- 瀏覽器極速模式和相容模式差異瀏覽器模式
- 異常-異常的概述和分類
- Git暫存區內容恢復到工作區Git
- 新手分享_再談FS暫存器
- CPU 中通用暫存器的作用
- 關於STM32的BSRR(埠位設定/清除暫存器) 和 BRR(埠位清除暫存器) 的理解(初學32)
- 異常-編譯期異常和執行期異常的區別編譯
- 痞子衡嵌入式:不清i.MXRTxxx裡FLEXSPI_MCR0暫存器保留位會造成IP CMD讀寫異常Flex
- Ionic異常及解決
- 如何發現 Kubernetes 中服務和工作負載的異常負載
- MVC使用異常過濾器處理異常MVC過濾器
- 除錯時檢視彙編和暫存器資料等除錯
- git將工作區內容加入到暫存區Git
- iOS彙編基礎(二)暫存器iOS
- 10.1 除錯事件讀取暫存器除錯事件
- 程式設計中暫存器的使用程式設計
- STM32 GPIO 暫存器的配置
- 第五章:通用暫存器是()。
- 暫存器指定為寫0或者1