目前,ARM系列的通用32位RISC微處理器有ARM7、ARM9、ARM9E、ARM10等多個產品,這些處理器可以工作于7種模式下。除User模式以外的其它模式都叫做特權模式,除User和System以外的其它5種模式叫做異常模式。大部分應用程序都在User模式下運行,當處理器處于User模式下時,執(zhí)行的程序無法訪問一些被保護的系統(tǒng)資源,以利于操作系統(tǒng)控制系統(tǒng)資源的使用,也不能改變模式,否則就會導致一次異常。對于System模式,任何異常都不會導致進入這一模式,而且它使用的寄存器和User模式下基本相同,主要是用于有訪問系統(tǒng)資源請求而又避免使用額外的寄存器的操作系統(tǒng)任務。在特權模式下,它們可以完全訪問系統(tǒng)資源,可以自由地改變模式。在處理特定的異常時,系統(tǒng)進入對應的異常模式下。這5種異常模式都有各自額外的寄存器,用于避免在發(fā)生異常的時候與用戶模式下的程序發(fā)生沖突。
在任意一種處理器模式中,都使用同一個寄存器來標識當前處理器的工作模式,這個寄存器叫做CPSR(當前程序狀態(tài)寄存器),它的0~4位用來表示CPU模式,而且在每一種處理器異常模式下,都有一個對應的SPSR(緩存程序狀態(tài)寄存器),用來保存進入異常模式前的CPSR的值。SPSR的作用就是當CPU從異常模式退出時,通過一條簡單的匯編指令就能夠恢復進入異常模式前的CPSR,該值保存在當前異常模式的SPSR中。
堆棧的初始化要處理的事情是為處理器的7個處理器模式分配堆?臻g。以下以FIQ模式下的堆棧設置為例說明:
ORR r1, r0, #LOCKOUT | FIQ_MODE;把模式放在r1中,LOCKOUT用來屏蔽中斷位;
MSR cpsr, r1 ;改變CPU的CPSR寄存器,進入到指定的FIQ模式;
MSR spsr, r2 ;保存前一模式;
LDR sp, =FIQ_STACK ;把FIQ模式下的堆棧起始值賦給當前的SP,F(xiàn)IQ_STACK是分配給FIQ模式堆棧空間(比如說1K字節(jié))的起始地址。按這種方式設置其它模式下的堆棧。