1、前言
ARM Cortex-A7 MPCore架構非常龐大和復雜,本文僅僅是記錄一些ARM架構相關的基礎知識,以便於后續的ARM匯編學習,對於更多ARM架構的相關知識,可以去ARM官網下載相關的文檔進行研究。
2、ARM Cortex-A7 MPCore簡介
ARM Cortex-A7 MPcore屬於ARM v7-A架構,處理器支持1~4個核心,通常是和ARM Cortex-A15組成big.LITTLE架構的,ARM Cortex-A15作為大核心,主要負責高性能運算,ARM Cortex-A7則主要負責普通應用,並且能夠更省電,ARM官網中對ARM Cortex-A7的簡介如下:
在28nm工藝下,Cortex-A7的運行頻率在1.2~1.6GHz,並且單核面積不大於0.45平方毫米(含有浮點單元、NEON和32KB的L1緩存),在典型的應用場景下功耗低於100mW,使得它非常適合對功耗要求更嚴格的移動設備。
ARM Cortex-A7 MPcore支持在一個處理器上選配1~4個核心,多核的配置架構圖如下:
ARM Cortex-A7 MPCore的L1 Cache可以選擇8KB、16KB、32KB、64KB,L2 Cache可以選擇不配,也可以選擇配置128KB、256KB、512KB、1024KB,例如,對於NXP研發的I.MX6UL這款SoC就是基於ARM Cortex-A7 MPCore架構的,它配置了32KB的L1指令Cache和32KB的L1數據Cache,還選擇配置了128KB的L2 Cache,該SoC的架構如下:
ARM Cortex-A7 MPCore使用的是ARMv7-A架構,該架構的主要特性如下:
- SIMDv2拓展整形和浮點型向量操作;
- 提供了與ARM VFPv4體系架構兼容的高性能單雙精度浮點指令,支持全功能的IEEE754;
- 支持大物理拓展(LPAE),最高可以訪問40bit存儲地址,最高支持1TB的內存;
- 支持硬件虛擬化;
- 支持Generic Interrupt Controller(GIC)V2.0;
- 支持NEON,可以加速多媒體和信號處理算法。
3、ARM Cortex-A處理器運行模式
ARM的體系結構是一種模式體系架構,在引入Security Extensions之前,有7種處理器運行模式,有6個處於特權模式,1個處於非特權模式,特權模式可以訪問系統的所有資源,而非特權模式對某些資源的訪問會有所限制。
下圖是ARMv6架構之前的處理器運行模式,也就是沒有引入Security Extensions時的處理器運行模式:
在新的ARMv7架構中,加入了Trust Zone安全拓展,因此新加入了一種運行模式:Monitor模式,此外,新的處理器架構還能支持虛擬化拓展,加入了另外一種運行模式:Hyp模式,因此ARM Cortex-A7架構中具有9種運行模式,下圖是ARMv7處理器運行模式圖,特權等級分為了三個等級PL0、PL1和PL2:
大多數程序都運行在User運行模式,但是該模式下是不能訪問所有系統資源的,有的資源訪問將會受限,如果想訪問這些受限的資源,就需要進行模式切換,可以通過軟件進行切換,也可以通過中斷或者異常進行切換。
4、ARM Cortex-A寄存器組
接下來,介紹一下ARM Cortex-A架構的寄存器,ARMv7-A架構提供了16個32bit的通用寄存器(R0~R15)供軟件使用,其中前15個寄存器(R0~R14)能用來作為通用的數據存儲寄存器,R15寄存器是程序計數器PC,用來保存將要執行的指令,此外,ARM架構還提供了一個當前程序狀態寄存器CPSR和一個備份程序狀態寄存器SPSR,其中SPSR寄存器是用來備份CPSR寄存器的,寄存器組如下所示:
在上面已經講述過了,ARMv7-A架構具有9種運行模式,每種運行模式都會有與之對應的寄存器組,每種運行模式可見的寄存器包括15個通用寄存器(R0~R14)、1個程序狀態寄存器CPSR和1個程序計數器PC,在這些寄存器中,有些是所有模式共用同一個物理寄存器,有一些則是各模式下所獨立擁有的,不同模式下的寄存器組如下所示:
上表中,淺色字體代表的寄存器是與User模式所共有的寄存器,藍色背景代表的寄存器是各個運行模式所獨自擁有的寄存器,可以看到,低寄存器組(R0~R7)是所有模式都共享同一組物理寄存器,只有在一些高寄存器組中,不同的模式下擁有自己獨有的寄存器,例如,在FIQ模式下,R8~R14是獨立的物理寄存器,當某個程序在FIQ模式下訪問R8寄存器的話,那么它實際訪問的是寄存器R8_fiq。
接下來,繼續分析ARM架構中的通用寄存器和程序狀態寄存器:
(1)通用寄存器
R0~R15就是通用寄存器,對於通用寄存器一般可以分為下面3類:
- 未備份寄存器,R0~R7
- 備份寄存器,R8~R14
- 程序計數器PC,R15
對於第1類未備份寄存器:
該類指的是R0~R7這8個寄存器,在所有的處理器模式下這8個寄存器都是共用的,對應着同一個物理寄存器,在不同的模式下,這8個寄存器的數據就會受到破壞,因此,這8個寄存器並沒有被用作特殊作用。
對於第2類備份寄存器:
該類寄存器中的R8~R12這5個寄存器具有兩種物理寄存器,在FIQ模式下對應着Rx_irq(x=8~12),其它模式下對應着Rx(x=8~12)物理寄存器,FIQ模式是快速中斷模式,在該模式下要求中斷需要快速執行,FIQ模式下中斷處理程序可以使用R8~R12寄存器,在該模式下的R8~R12是獨立的物理寄存器,因此在執行中斷處理程序時可以不用執行保存和恢復中斷現場的指令,從而加快中斷程序的執行過程。
備份寄存器R13一共有8個物理寄存器,其中一個是User模式和Sys模式共用,剩下的7個寄存器分別對應着不同的處理器模式,R13寄存器也叫堆棧指針(SP),基本上每種模式都有一個R13物理寄存器,程序會初始化R13,讓其指向模式下專用的棧地址。
備份寄存器R14一共有7個物理寄存器,其中一個是User模式、Sys模式和Hyp模式所共用,剩下的6個基礎對應着不同的運行模式,R14也叫做鏈接寄存器(LR),對於ARM架構,該寄存器主要有以下用途:
1)不同處理器模式下使用R14(LR)來存放當前子程序的返回地址,如果使用BL或BLX指令來調用子函數,則R14(LR)被設置成該子函數的返回地址,在子函數中,將R14中的值賦給R15(PC),就可以完成子函數的返回,例如,可以在子程序中使用下面代碼返回:
MOV PC,LR @將LR的值賦給PC,實現跳轉 or PUSH {LR} @在子函數的入口將LR入棧 ... POP {PC} @在子函數的最后將LR出棧到PC
2)當異常發生后,該異常模式對應的R14設置成異常模式需要返回的地址;
3)R14用作普通寄存器。
對於第3類寄存器,程序計數器R15:
程序計數器R15也叫作PC,由於ARM處理器的3級流水線:取指->譯碼->執行,對於32bit的ARM架構處理器,每條指令是4個字節,R15(PC)的值如下:
R15(PC) = 當前程序執行的位置 + 8個字節
(2)程序狀態寄存器
對於ARM v7-A架構的處理器的所有運行模式都共用一個程序狀態寄存器(CPSR),該寄存器在任何模式都能夠被訪問,CPSR寄存器包含了條件標志位、中斷禁止位、當前處理器運行模式標志位等,由於所有的運行模式都共用一個CPSR寄存器,因此必然會導致沖突,所以,除了Usr和Sys模式,其它的7個運行模式都對應了一個專用的物理寄存器,叫做備份程序狀態寄存器(SPSR),例如,當特定的異常中斷產生時,SPSR用來保存當前程序狀態寄存器(CPSR)的值,當異常中斷退出以后,使用SPSR中保存的值來恢復CPSR寄存器。
SPSR寄存器的結構和CPSR寄存器的結構一樣,CPSR寄存器結構如下:
該寄存器結構中的位含義如下:
N(bit31):當兩個使用補碼表示的有符號整數運算時,N=1表示運行的結果為負數,N=0表示結果為正數;
Z(bit30):Z=1表示運算結果為0,Z=0表示運算結果不為0,對於CMP指令,Z=1表示進行比較的兩個數大小相等;
C(bit29):在加法指令中,C=1表示結果產生了進位,表示無符號數運算發生上溢,其它情況下C=0,在減法指令中,C=0表示運算中發生借位,表示無符號運算發生下溢,其它情況下C=1,對於包含移位操作的非加/減法運算指令,C中包含最后一次溢出的位的數值;
V(bit28):對於加/減法運算指令,當操作數和運算結果表示為二進制的補碼表示的帶符號數時,V=1表示符號位溢出;
Q(bit27):僅ARM v5TE_J架構支持,Q=1表示累積飽和,Q=0表示累積不飽和;
IT[1:0](bit26:25):和IT[7:2](bit15:10)一起組成IT[7:0],表示IF-THEN指令的執行狀態;
J(bit24):僅ARM v5TE_J架構支持,j=1表示處於Jazelle狀態,通常和T(bit5)一起表示當前所使用的指令集,含義如下:
J | T | 含義 |
0 | 0 | ARM |
0 | 1 | Thumb |
1 | 1 | ThumbEE |
1 | 0 | Jazelle |
GE[3:0](bit19:16):SIMD指令有效,大於或等於;
IT[7:2](bit15:10):和IT[1:0](bit26:25)一起組成IT[7:0],表示IF-THEN指令的執行狀態;
E(bit9):大小端控制位,E=1表示大端模式,E=0表示小端模式;
A(bit8):禁止異步中斷位,A=1表示禁止異步中斷;
I(bit7):禁止IRQ中斷位,I=1表示禁止IRQ,I=0表示使能IRQ;
F(bit6):禁止FIQ中斷位,F=1表示禁止FIQ,I=0表示使能FIQ;
T(bit5):控制指令執行狀態;
M(bit4:0):處理器運行模式控制位,含義如下:
M[4:0] | 處理器運行模式 |
10000 | User模式 |
10001 | FIQ模式 |
10010 | IRQ模式 |
10011 | SVC模式 |
10110 | MON模式 |
10111 | ABT模式 |
11010 | HYP模式 |
11011 | UND模式 |
11111 | SYS模式 |
5、小結
本文主要記錄了一些ARM v7-A架構的相關基礎知識,並對了ARM架構的寄存器組作簡單介紹。