【讀書筆記】ARM體系結構與編程 — 第一章 | 杜春雷[著]

第一章 ARM概述及其基本編程模型

1.1 ARM技術的應用領域與其特點

1.2 ARM體系結構的版本和命名方法

ARM體系結構的版本

3.版本3
  • 處理器的地址擴展到32位
  • 當前的程序狀態信息從原來的R15寄存器移到一個新的寄存器CPSR(Current Program Status Register)。
  • 增加SPSR(Saved Program Status Register),用於在程序異常中斷程序時,保存被中斷的程序狀態。
  • 增加了指令MRS和MSR,用於訪問CPSR和SPSR。
4.版本4
  • 增加了T變種,可以從處理器狀態切換到Thumb狀態,在該狀態下指令集是16位的Thumb指令。
  • 增加了處理器的特權模式。在該模式下,使用的是用戶模式下的寄存器。
5.版本5
  • 增加了前導零計數指令:使整數除法和中斷優先級排隊操作更爲有效。
  • 增加軟件斷點指令
6.版本6

增加SIMD功能。SIMD功能擴展爲包括音頻/視頻在內的應用系統提供了優化功能,可以使

ARM體系的變種

thumb指令集(T變種)

Thumb指令集是將ARM指令集的一個子集重新編碼而形成的一個指令集。ARM指令長度爲32位,Thumb指令長度爲16位。Thumb指令集可以得到密度更高的代碼。

長乘法指令(M變種)

增加兩條長乘法操作的ARM指令

  • 實現32位整數乘以32位整數
  • 實現32位整數乘以32位整數+32位整數
增強型DSP指令(E變種)

增強處理器對DSP算法的處理性能

Java加速器(J變種)

java加速功能

ARM媒體功能擴展(SIMD變種)

ARM媒體功能擴展爲嵌入式應用系統提供了高性能的音頻/視頻處理技術。
ARM的SIMD媒體功能擴展爲包括音頻/視頻在內的應用系統提供了優化功能,可以使音頻/視頻處理性能提高4倍

1.3 ARM處理器系列

  • ARM7
  • ARM9
  • ARM9E
  • ARM10E
  • SecurCore

1.3 ARM處理器系列

ARM處理器共有7種運行模式

處理器模式 描述
用戶模式(User,usr) 正常(用戶)程序執行的模式
快速中斷模式(FIQ,fiq) 用於高速數據傳輸和通道處理
外部中斷模式(IRQ,irq) 用於通常的中斷處理
管理模式(Supervisor,sve) CPU上電後默認模式,主要用來做系統的初始化 供操作系統使用的一種保護模式
數據訪問中止模式(Abort,abt) 用於虛擬存儲及存儲保護
未定義指令中止模式(Undefined,und) 用於支持通過軟件仿真硬件的協處理器
系統模式(System,sys) 用於運行特權級的操作系統任務

在這裏插入圖片描述

  • 特權模式下,程序可以訪問所有的系統資源,也可以任意地進行處理器模式的切換
  • 處理器模式的切換 by
    • 軟件控制
    • 外部中斷或異常處理
  • 大多數的用戶程序運行在用戶模式下,不能訪問一些受操作系統保護的系統資源,應用程序也不能直接進行處理器模式的切換。當需要進行處理器模式切換時,應用程序可以產生異常處理,在異常處理過程中進行處理器模式的切換。
  • 系統模式不是通過異常過程進入的,它和用戶模式具有完全一樣的寄存器。它主要供操作系統任務使用。通常操作系統的任務需要訪問所有的系統資源,同時該任務仍然使用用戶模式的寄存器組,而不是使用異常模式下相應的寄存器組,這樣可以保證當異常中斷髮生時任務狀態不被破壞。

1.5 ARM寄存器介紹

ARM處理器有37個寄存器,其中包括

  • 31個通用寄存器 [ 32位寄存器 ] 。
  • 6個狀態寄存器
用戶模式 系統模式 管理模式 中止模式 未定義模式 外部中斷模式 快速中斷模式
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_fiq
R9 R9 R9 R9 R9 R9 R9_fiq
R10 R10 R10 R10 R10 R10 R10_fiq
R11 R11 R11 R11 R11 R11 R11_fiq
R12 R12 R12 R12 R12 R12 R12_fiq
R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

在這裏插入圖片描述

1.5.1 通用寄存器

通用寄存器可以分爲 3 類

  • 未備份寄存器(Unbanked Registers),R0~R7。
  • 備份寄存器(Banked Regsiter),包括 R8~R14。
  • 程序計數器 PC,即R15。
未備份寄存器 R0~R7

在所有的處理器模式下指的都是同一個物理寄存器
在異常中斷造成處理器模式切換時,由於不同的處理器模式使用相同的物理寄存器,可能造成寄存器中數據被破壞。
未備份寄存器沒有被系統用於特別的用途,任何可採用通用寄存器的應用場合都可以使用未備份寄存器。

備份寄存器 R8~R14
  • R8~R12
    • 每個寄存器對應兩個不同的物理寄存器
      eg. 當使用快速中斷模式下的寄存器時,寄存器R8和R9分別記爲 R8_fiq、R9_fiq;當使用用戶模式下的寄存器時,寄存器R8和R9分別記爲R8_usr、R9_usr。在這兩種情況下使用的是不用的物理寄存器,
    • 系統沒有將這幾個寄存器用於任何特殊用途,但是當中斷處理非常簡單,僅僅使用R8~R14,FIQ處理程序可以不必執行保存和恢復中斷現場的指令,從而可以使中斷處理過程非常迅速。
  • R13~R14

對於R13、R14 來說,每個寄存器對應6個不同的物理寄存器,其中,用戶模式和系統模式共用一個物理寄存器,另外5個對應其他的處理器模式。

R13_<mode>   //mode: usr、svc、abt、und、irq、fiq
  • R13(Stack Pointer)
    • 在ARM中常用作棧指針(Stack Register,SR)
    • 在ARM指令集中,這只是一種習慣用法,並沒有任何指令強制性地使用R13作爲棧指針,用戶也可以使用其他的寄存器作爲棧指針
      在Thumb指令集中,有一些指令強制性的使用R13作爲棧指針。
    • 每種異常模式擁有自己的物理的R13。應用程序初始化 R13,使其指向該異常模式專用的棧地址
      當進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出處理程序時,將保存在R13所指的寄存器值彈出。
      這樣就使異常處理程序不會破壞被其中斷程序的運行現場

  • R14:連接寄存器(Link Register,LR)在ARM體系中具有下面兩種特殊的作用:
    • (1)每種處理器模式自己的物理R14中存放着當前子程序的返回地址。當通過 BL 或 BLX 指令調用子程序時,R14被設置爲該子程序的返回地址。在子程序中,當把R14的值複製到程序計數器PC中時,子程序返回。可以通過下面兩種方式實現子程序的返回
   /*1)執行下面任何一條命令 */
   MOV  PC , LR
   BX  LR

   /*2)在子程序入口使用下面的指令將PC保存到棧中  */
   STMFD  SP ! , { <register>, LR }
   LDMFD  SP ! , { <register>,PC }
  - (2)當異常中斷髮生時,該異常模式特定的物理R14被設置成**該異常模式將要返回的地址**。對於有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與上面的子程序返回方式基本相同。

程序計數器 R15 PC(Program Counter)
  • 由於ARM採用流水線機制,讀取到的PC=當前指令地址+8個字節,即,PC指向當前指令的下兩條指令的地址。
  • 由於ARM指令是字對齊,PC值的第0位和第1位總爲0;(因爲是字對齊也就是4字節對齊方式,,也就是你的地址必須是4的倍數,顯然PC的第0位和第一位是0,如果是半字對齊的話,那麼就變成第0位必須爲0)
  • 當使用STR/STM指令來保存R15時,保存的可能是當前指令地址值加8字節或者12字節,取決於芯片的具體設計方式,因此儘量避免使用STR/STM保存R15的值
  • 當成功向R15寫入一個地址數值時,程序將跳轉到改地址執行。由於ARM指令是字對齊,寫入R15的地址值應該滿足 bits [1:0]=0b00。
    • 對於ARMv3以及更低版本,R15的地址值將與0xFFFF FFFC相與。
    • 對於ARMv4以及更高版本,程序必須保證bits [1:0]=0b00;
    • 對於Thumb指令,是半字對齊,R15的地址值將與0xFFFF FFFE相與。

1.5.2 程序狀態寄存器 CPSR | SPSR

  • CPSR(當前程序狀態寄存器)可以在任何處理器模式下被訪問,它包含條件標緻位、中斷禁止位、當前處理器模式標誌以及其他的控制和狀態位。
  • 每一種異常處理器模式下都有一個專用的物理狀態寄存器,稱爲SPSR(備份程序狀態寄存器)。當特定的異常中斷髮生時,這個寄存器用於存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR中保存的值來恢復CPSR
  • 由於用戶模式和系統模式不是異常中斷模式,所以他們沒有SPSR
  • CPSR | SPSR 格式
31 30 29 28 27 26:8 7 6 5 4 3 2 1 0
N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0
1.條件標誌位 N、Z、C、V
  • N(Negative)
    • 設置成當前指令運算結果的bit[31]的值
    • 當兩位補碼錶示的有符號整數運算,N=1表示運算結果爲負數N=0表示運算結果爲正數
  • Z(Zero)
    • Z=1 表示運算結果爲0Z=0 表示運算結果不爲0
    • 對於CMP指令,Z=1表示進行比較的兩個數大小相等
  • C(Carry)
    • 加法指令中(包括比較指令CMN),發生進位,則C=1,表示無符號數運算發生溢出;其他情況下C=0;
    • 減法指令中(包括比較指令CMP),發生借位,則C=0,表示無符號數運算發生溢出;其他情況C=1;
    • 對於包含移位操作非加/減法運算指令,C中包含最後一次被溢出的位的數值。
    • 對於其他非加/減法指令,C位的值通常不受影響
  • V(oVerflow)
    • 對於加/減法運算指令,當操作數和運算結果爲二進制的補碼錶示的帶符號數時,V=1表示符號位溢出
    • 通常其他指令不影響V位。
以下指令會影響CPSR中條件標誌位
  • 比較指令,如CMP,CMM,TEQ和TST等
  • 當一些算術指令和邏輯指令的目標寄存器不是R15時,這些指令會影響CPSR中的條件標誌位。
  • MSR可以向CPSR/SPSR中寫入新值。
  • MRC指令將R15作爲目標寄存器時,可以把協處理器產生的條件標誌位的值送到ARM處理器。
  • 一些LDM指令的變種指令可以將SPSR的值複製到CPSR中,這種指令主要用於異常中斷程序中返回。
  • 一些帶“位設置”的算術和邏輯指令的變種指令,也可以將SPSR的值複製到CPSR中,這種指令主要用於異常中斷程序中返回。
2.Q標誌位

bit[27] – > 主要用於增強的DSP指令是否發生溢出

3.CPSR中的控制位

低八位【I 、F、T、M[4:0] 】統稱爲控制位。

  • 中斷禁止位
    • I = 1 時,禁止IRQ中斷;
    • F = 1時,禁止FIQ中斷;
  • T控制位
    控制指令執行的狀態,說明是ARM指令、還是Thumb指令。
    • ARMv4以及更高版本的T系列ARM處理器,
      • T = 0執行ARM指令
      • T = 1執行Thumb指令
    • ARMv5以及更高版本的非T系列ARM處理器,
      • T = 0執行ARM指令
      • T = 1 表示強制下一條執行的指令產生未定義中斷
    • M控制位
      M[4:0]控制處理器模式
      在這裏插入圖片描述
4.CPSR中的其他位

CPSR中的其他位用於將來ARM版本的擴展。

1.6ARM體系的異常中斷

3種方式控制程序的執行流程:

    1. 正常程序執行過程中,每執行1條ARM指令,PC+4byte;每執行一條Thumb指令PC+2byte。整個過程按順序執行
    1. 通過跳轉指令,程序可以跳轉到特定的地址標號處執行,或者到特定的子程序處執行。
    • B 用於執行跳轉操作
    • BL 在執行跳轉的同時保存子程序的返回地址
    • BX 在執行跳轉操作的同時,根據目標地址的最低位可與將程序狀態切換到Thumb狀態。
    • BLX執行3個操作,到目標地址處執行,保存子程序的返回地址,根據目標地址的最低位可以將程序狀態切換到Thumb
  • 異常中斷發生時,系統執行完當前指令後,跳轉到相應的異常中斷處理程序處執行。在異常中斷處理程序執行完後,程序返回到發生中斷的指令的下一條指令處執行。在進入異常中斷處理程序時,要保護被中斷的程序執行現場,在從異常中斷處理程序退出時,要恢復被中斷的程序的執行現場

1.6.1 ARM中異常中斷的種類

異常中斷名稱 含義
復位(Reset) 當處理器的復位引腳有效時,系統產生復位異常中斷,程序跳轉到復位異常中斷處理程序處執行。復位異常中斷一般有以下幾種情況。 系統加電時;系統復位時;軟復位:跳轉到復位中斷向量處執行;
未定義的指令(Undefined Instruction) 當ARM處理器或者是系統中的協處理器認爲當前指令未定義時,產生未定義的指令異常中斷。可以通過該異常中斷機制仿真浮點向量運算
軟件中斷(Sofeware Interrupt,SWI) 可用於用戶模式下的程序調用特權操作指令。在實時操作系統(RTOS)中可以通過該機制實現系統功能調用
指令預取址中斷(Prefetch Abort) 如果處理器預取的指令不存在,或者該地址不允許當前指令訪問,當該被預取的指令執行時,處理器產生指令預取中止異常中斷
數據訪問中止(Data Abort) 如果數據訪問指令的目標地址不存在,或者該地址不允許當前指令訪問,處理器產生數據訪問中止異常
外部中斷請求(IRQ 當處理器的外部中斷請求引腳有效,而且CPSR的I控制位被清除時,處理器產生IRQ異常中斷,系統中個外設通常通過該異常中斷請求處理器服務
快速中斷請求(FIQ) 當處理器的外部快速中斷請求引腳

1.6.2 ARM處理器對異常中斷的響應過程

(1)保存處理器當前狀態、中斷屏蔽位、以及各條件標誌位。這是通過將CPSR的內容保存到將要執行的異常中斷對應的SPSR
(2)設置CPSR中的對應位,使處理器進去響應的執行模式;禁止IRQ中斷;進入FIQ模式時,禁止FIQ中斷
(3)將寄存器lr_mode設置成返回地址
(4)將PC設置爲該異常中斷的中斷向量地址,從而跳轉到相應的異常中斷處理程序處執行

1.6.3從異常中斷處理程序中返回

(1)恢復被中斷的程序的處理器狀態,即將SPSR_mode寄存器內容複製到CPSR中。
(2)返回到發生異常中斷的指令的下一條指令處執行,即把lr_mode寄存器的內容複製到PC中。
當異常中斷髮生時,PC所指的位置對於各種不同的異常中斷時不同的,同樣,返回地址也不同。

1.7ARM體系中的存儲系統

1.7.1 ARM系統中的存儲空間

使用單一的地址空間,該地址空間的大小爲232**個**8位字節**。這些字節單元的地址都是無符號的32位數值。也可以看做是**23032位的字單元,這些字節單元的地址可以被4整除,地址爲A的字數據包括地址爲A、A+1、A+2、A+3四個字節單元的內容。在ARMv4及以上版本,也可以看做2^3116位的半字單元,這些半字單元的地址可以被2整除,地址爲A的半字數據包包括A、A+1兩個字節單元的內容。

1.7.2 ARM存儲器格式

Big-endian

在這裏插入圖片描述

Little-endian

在這裏插入圖片描述

1.7.3非對齊的存儲訪問操作

1.非對齊的指令預取操作

如果寫到寄存器PC中的值非字對齊

  • ARM狀態下
    • 指令執行的結果不可預知
    • 地址中的最低兩位被忽略
  • Thumb
    • 指令執行的結果不可預知
    • 地址中的最低位被忽略

如果系統中指定,當發生非對齊的指令時,忽略地址中的相應位,則由存儲系統實現這種“忽略”,也就是說,這時該地址原封不動的送到存儲系統。

2.非對齊的數據訪問操作

對於Load/Store操作,如果是非對齊的數據訪問操作,則系統定義了一下三種結果

  • 執行的結果不可預知
  • 忽略字單元地址的低兩位的值,即訪問地址爲(addr & 0xffff fffc)的字單元;
  • 忽略半字單元地址的最低位的值,即訪問地址爲(addr & 0xffff fffe)的字單元;

當發生非對齊的數據訪問時,到底採用哪一種,是由個指令指定的。

1.7.2 指令預取和自修改代碼

在CPU執行當前指令的同時,可以從存儲器中預取其後若干條指令,具體預取多少條,不同的ARM實現中有不同的數值。
預取的指令並不一定得到執行:

  • 當前指令完成後,如果發生了異常中斷,程序將會跳轉到異常中斷處理程序處執行,當前預取的指令將被拋棄。
  • 執行了跳轉指令,當前預取的指令也會被拋棄。

自修改代碼指的是代碼在執行過程中可能修改自身。
當指令被預取後,在該指令被執行前,如果有數據訪問指令修改了位於主存中的該指令,這是被預取的指令主存中的指令不同,從而可能使執行的結果發生錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章