ARM裸機程式開發——ARM執行模式及暫存器
現在來總結一下ARM的執行模式以及暫存器
★ARM的執行模式型別
ARM微處理器有7中執行模式:使用者模式(user)、系統模式(system)、一般中斷模式(IRQ)、快速中斷模式(FIQ)、管理模式(supervisor、svr)、中止模式(abort)、未定義指令中止模式(undefined)
◇這七種執行模式分別用於什麼情況下?
▲使用者模式:使用者模式是使用者程式的工作模式,它執行在作業系統的使用者態,沒有許可權去操作硬體資源,只用執行處理自己的資料,也不能切換到其他的模式。如果想要訪問硬體資源只能靠兩種辦法:產生異常或者軟中斷
▲系統模式:系統模式是特權模式,不受使用者模式的限制。使用者模式跟系統模式共用一套暫存器。作業系統在該模式下可以訪問使用者模式的暫存器,作業系統的一些特權任務也可以使用這個模式訪問一些受控的資源。
▲一般中斷模式:又叫做普通中斷模式,用於一般的中斷請求,通常在硬體產生中斷後進入該模式,該模式可以自由訪問硬體資源
▲快速中斷模式:相對於一般中斷模式,用於處理緊急的中斷請求,主要用於高速資料傳輸及通道處理中
▲管理模式:CPU上電後,預設會進入到這個模式,用來做系統的一些初始化工作,軟中斷處理也在該模式下。當用戶模式下的使用者程式請求使用硬體資源時通過軟體中斷進入該模式
▲中止模式:用於虛擬記憶體以及儲存器的保護,當用戶程式訪問非法地址或者沒有許可權讀取的地址時,會進入該模式。在Linux程式設計中,經常會出現segment fault一般都是在該模式下丟擲的返回
▲未定義模式
用於支出硬體協處理器的軟體模擬,CPU在指令的譯碼階段不能識別的指令操作時,就會進入未定義模式
◇他們的關係圖
◇這幾種模式具體是如何切換的?(閱讀Bootloader原始碼)
★ARM暫存器
ARM中共有37個暫存器,但是不能在任何模式下都可以使用,它與工作模式有關係。不同的工作模式會使用不同的暫存器組。
◇通用暫存器
通用暫存器可分為不分組暫存器(R0-R7)和分組暫存器(R8-R14)和程式計數器(R15)
◇不分組暫存器(R0-R7)
不分組暫存器工作在所用的模式下,並且沒有隱含的功能
◇分組暫存器(R8-R14)
分組暫存器(R8-R14)則取決於當前的處理器工作模式,每種工作模式都有專用的分組暫存器。暫存器R8-R12可以分為2組物理暫存器。一組用於FIQ模式,另一組用於除FIQ之外的其他模式。暫存器R13-R14可分為6個分組的物理暫存器。1個用於使用者模式和系統模式,其他5個分別用於svc,abt,und,irq和fiq這5個異常模式。訪問時需要指定他們的模式。R13_svc,R13_abt等等
◇程式計數器(R15)▲什麼是分組暫存器?
分組暫存器在CPU不同的工作模式下所指向的物理暫存器是不同的。例如:對於分組暫存器R8-R12來說,它指向兩組不同的物理暫存器。FIQ模式用一組,其他模式使用另外一組。那麼在FIQ模式和其他幾個模式下,雖然都是使用R8-R12這幾個暫存器,但是它們卻是使用了不相同的物理暫存器。
▲分組暫存器有什麼作用?(或者說為什麼會出現分組暫存器呢)
就使用R8-R12這幾個分組暫存器。都知道這幾個暫存器分為2組,其中FIQ模式使用一組,假設為A組,其他的工作模式使用另一組,假設為B組。那麼當CPU執行在使用者模式的時候,使用的是B組暫存器。這是突然產生一個快速中斷,CPU轉換為FIQ模式,然後處理中斷。而快速中斷模式一般使用來處理比較緊急的中斷,主要用於高速的資料傳輸及通道處理,因此FIQ模式下處理的中斷一般都是體現處理速度要非常快。如果FIQ模式與USER模式使用同一組暫存器,就會出現這樣的情況,首先要將USER模式下這組暫存器的值儲存下來,然後才能處理FIQ模式的中斷,最後在將USER模式下的暫存器值還原,這樣就會減慢了速度。而使用兩組暫存器則可以解決這個問題。
暫存器R15被用作程式計數器
◇狀態暫存器CPSR
▲條件程式碼標誌位
▲保留位
▲控制位
△中斷禁止位
I = 1 禁止IRQ中斷
F = 1 禁止FIQ中斷
△T位
該位反應了執行著的狀態
T = 1執行在Thumb狀態
T = 0 執行在ARM狀態
△模式位
決定了CPU的工作模式
◇程式狀態儲存暫存器SPSR