ARM工作模式
一、存儲器格式(字對齊):
Arm體系結構將存儲器看做是從零地址開始的字節的線性組合。從零字節到三字節放置第一個存儲的字(32位)數據,從第四個字節到第七個字節放置第二個存儲的字數據,一次排列。作為32位的微處理器,arm體系結構所支持的最大尋址空間為4GB。
存儲器格式
1、大端格式:高字節在低地址,低字節在高地址;
2、小端格式:高字節在高地址,低字節在低地址;
指令長度:
Arm微處理器的指令長度是32位的,也可以為16位(thumb狀態下)。Arm微處理器中支持字節(8位),半字(16位),字(32位)三種數據類型,其中,字需要4字節對齊,半字需要2字節對齊。
注:所謂的指令長度是一條完整的指令的長度,而不是單純的mov這3個字母長度
二、ARM體系的CPU有兩種工作狀態
1、ARM狀態:處理器執行32位的字對齊的ARM指令;
2、Thumb狀態:處理器執行16位的、半字對齊的Thumb指令;
在程序運行的過程中,可以在兩種狀態之間進行相應的轉換。處理器工作狀態的轉變並不影響處理器的工作模式和相應寄存器中的內容。
CPU上電處於ARM狀態
三、ARM體系的CPU有以下7種工作模式:
1、用戶模式(Usr):用於正常執行程序;
2、快速中斷模式(FIQ):用於高速數據傳輸;
3、外部中斷模式(IRQ):用於通常的中斷處理;
4、管理模式(svc):操作系統使用的保護模式;
5、數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用於虛擬存儲以及存儲保護;
6、系統模式(sys):運行具有特權的操作系統任務;
7、未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用於支持硬件;
Arm的工作模式切換有兩種方法:
被動切換:在arm運行的時候產生一些異常或者中斷來自動進行模式切換
主動切換:通過軟件改變,即軟件設置寄存器來經行arm的模式切換,應為arm的工作模式都是可以通過相應寄存器的賦值來切換的。
Tips:當處理器運行在用戶模式下,某些被保護的系統資源是不能被訪問的。
除用戶模式外,其余6種工作模式都屬於特權模式;
特權模式中除了系統模式以外的其余5種模式稱為異常模式;
大多數程序運行於用戶模式;
進入特權模式是為了處理中斷、異常、或者訪問被保護的系統資源;
四、寄存器
ARM有31個通用的32位寄存器,6個程序狀態寄存器,共分為7組,有些寄存器是所有工作模式共用的,還有一些寄存器專屬於每一種工作模式;
R13——棧指針寄存器,用於保存堆棧指針;
R14——程序連接寄存器,當執行BL子程序調用指令時,R14中得到R15的備份,而當發生中斷或異常時,R14保存R15的返回值;
R15——程序計數器;
快速中斷模式有7個備份寄存器R8—R14,這使得進入快速中斷模式執行很大部分程序時,甚至不需要保存任何寄存器;
其它特權模式都含有兩個獨立的寄存器副本R13、R14,這樣可以令每個模式都擁有自己的堆棧指針和連接寄存器;
五、當前程序狀態寄存器(CPSR)
CPSR中各位意義如下:
T位:1——CPU處於Thumb狀態, 0——CPU處於ARM狀態;
I、F(中斷禁止位): 1——禁止中斷, 0——中斷使能;
工作模式位:可以改變這些位,進行模式切換;
六、程序狀態保存寄存器(SPSR)
當切換進入某一個特權模式時,SPSR保存前一個工作模式的CPSR值,這樣,當返回前一個工作模式時,可以將SPSR的值恢復到CPSR中;

Linux用戶態程序運行在FIQ,Linux內核運行在Supervisor模式
七、模式切換
當異常發生,CPU進入相應的異常模式時,以下工作是由CPU自動完成的:
1、在異常模式的R14中保存前一工作模式的下一條即將執行的指令地址;
2、將CPSR的值復制到異常模式的SPSR中;
3、將CPSR的工作模式設為該異常模式對應的工作模式;
4、令PC值等於這個異常模式在異常向量表中的地址,即跳轉去執行異常向量表中的相應指令;
從異常工作模式退回到之前的工作模式時,需要由軟件來完成以下工作:
1、將異常模式的R14減去一個適當的值(4或8)后賦給PC寄存器;
2、將異常模式SPSR的值賦給CPSR;
早期的ARM核有狀態(ARM或Thumb)切換(通過BX等指令修改CPSR寄存器(當前程序狀態寄存器,存放條件碼標志,中斷禁止位,當前處理器模式以及其他狀態和控制信息)中T的控制位完成程序狀態的切換),現在ARM都只使用Thumb狀態了。所以,我們不在討論狀態切換相關。
一、ARM七種工作模式及其應用場合(Linux操作系統使用了其中USR和SVC模式、出現異常時還可能通過進入其他模式轉為Linux內核態)
在CPSR寄存器中設置M[4:0]位,分別對應如下七種模式(注意:用戶模式和系統模式只有對CPSR的讀權限,因此、這兩種模式下不可以通過直接設置CPSR進入其他模式(SWI匯編指令除外)):
1.用戶模式(USR):用於正常執行程序。在Linux操作系統中,用戶空間進程就是在這種模式下運行。CPSR寄存器M[4:0]設置10000。
2.系統模式(SYS):運行有特權的操作系統任務。CPSR寄存器M[4:0]設置11011。
這個模式和用戶模式共用R15-pc(程序計數器,存放下一條指令所在單元的地址)的值,因此不用ARM強制賦值。
ARM進入以下幾種模式后,都需要給R15-PC寄存器重新賦值、也就是開始執行新的指令。
3.管理模式(SVC):操作系統使用的保護模式(高權限)。在Linux操作系統中,內核空間在這種模式下運行。CPSR寄存器M[4:0]設置10011。
當ARM剛上電或復位時、進入該模式,並強制PC從0x0000 0000處取指令;當系統軟中斷(如系統調用,調用ARM的SWI匯編指令)時、進入該模式,並強制PC從0x0000 0008處取指令——這也是ARM從用戶模式主動切入管理模式(Linux從用戶態主動進入內核態)的唯一方法。后面章節會詳細分析。
《ARM與Linux些許問題》第三章:Linux如何從用戶態進入內核態
《ARM與Linux些許問題》第四章:ARM平台系統調用原理分析
當出現異常狀況時,Linux還有可能在如下幾種ARM模式下運行;如硬件中斷、程序問題導致的異常等。
4.快速中斷模式(FIQ):用於高速數據傳輸。CPSR寄存器M[4:0]設置10001。
進入該模式后、ARM強制PC從0x0000 001C處取指令。
5.外部中斷模式(IRQ):用於通常的中斷處理。CPSR寄存器M[4:0]設置10010。
進入該模式后、ARM強制PC從0x0000 0018處取指令。
6.數據訪問終止模式(ABT):當數據或指令預取終止時進入該模式,可用於虛擬內存及存儲保護。CPSR寄存器M[4:0]設置10111。
當指令取終止時、進入該模式,並強制PC從0x0000 000C處取指令;當數據取終止時、進入該模式;並強制PC從0x0000 0010處取指令。
7.未定義指令終止模式(UND):當未定義的指令執行時進入該模式,可用於支持硬件。CPSR寄存器M[4:0]設置11111。
當程序中出現未定義的指令時、進入該模式,並強制PC從0x0000 0004處取指令。
在非user模式下的其他6中模式,有SVC,FIQ,IRQ,ABT,UND,SYS 都可以修改CPSR寄存器、從而控制ARM工作模式的切換。
在Linux操作系統中;當CPU處於特權模式(Linux處於內核態)時,可以隨意進入用戶態。而當CPU處於用戶模式(Linux處於用戶態)時,Linux從用戶態切換到內核態(ARM從用戶模式切換到其他特權模式)只有在系統調用和中斷(中斷進入IRQ模式,也可以操作內核)兩種情況下發生,一般程序一開始都是運行於用戶態,當程序需要使用系統資源時,就必須通過調用軟中斷進入內核態。
每一種工作模式的R13-SP(堆棧指針寄存器,在堆棧操作中使用)都是獨立的。因此,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。方法是改變狀態寄存器(CPSR)內的狀態位,使處理器切換到不同的狀態,然后給SP賦值。注意:不要切換到User模式進行User模式的堆棧設置,因為進入User模式后就不能再操作CPSR回到別的模式了,可能會對接下去的程序執行造成影響。
ARM在剛上電或復位后、進入SVC管理模式,並從0x0000 0000開始取指令;bootloader和Linux Kernel都是工作在此模式。
二、ARM工作模式切換的兩種方法
1.被動切換:是指ARM在當前工作模式下,沒有要求模式切換、而被動地進入另外一種模式。在ARM運行的時候產生一些異常(包括軟中斷)或者中斷(硬中斷)來進行模式切換。如上邊提到的Linux操作系統從用戶態到內核態,如硬件中斷或程序異常。內核態不會被動切換到用戶態。
2.主動切換:是指ARM在當前工作模式下,通過一些自主操作、主動的要求切換工作模式。ARM通過軟件改變,即軟件設置寄存器來進行ARM的模式切換,因為ARM的工作模式都是可以通過相應寄存器的賦值來切換的。如上邊提到的Linux操作系統從內核態到用戶態;這里邊有一個比較特殊的情況:Linux用戶態可以通過系統調用主要要求切換到內核態。
后邊,我還會分析重點分析從Linux從用戶態到內核態的切換。見《ARM與Linux些許問題》第三章:Linux如何從用戶態進入內核態
====================================================================================================================================
ARM主要寄存器匯總:
CPSR及SPSR:當前程序狀態寄存器和保存程序狀態寄存器;
R15-PC及R14-LR:程序計數器和用戶保存PC的連接寄存器;
R13-SP:堆棧指針。