對于現代操作系統,通常情況下用戶的應用程序運行在用戶態,操作系統內核運行在內核態。用戶態的應用對于系統硬件資源的訪問是受限的,內核態則能夠訪問所有的系統硬件資源。操作系統的用戶態和內核態是根據處理器的特權等級和運行模式進行硬件隔離的,這也極大的提高了操作系統的安全性。
安全擴展和虛擬化擴展
ARMv7-A體系結構支持安全擴展和虛擬化擴展。當處理器實現了安全擴展之后,處理器就存在普通世界(Normal world)和安全世界(Secure world)這兩個世界,這在硬件層面上就可以將敏感數據和要求在安全環境運行的應用和普通應用完全隔離,如下圖所示:
Snipaste_2023-08-31_19-16-22
當處理器實現了虛擬化擴展之后,處理器就新增了一個hypervisor mode (Hyp),并且也新增了一個特權級模式PL2。支持虛擬化擴展的處理器示意圖如下所示:
Snipaste_2023-08-31_19-28-22
虛擬化擴展允許在Normal world運行多個操作系統,Hypervisor只能運行在Normal world。Secure world可以運行Trusted OS和Trusted services。
特權等級
處理器的模式,特權等級和安全狀態的關系如下圖所示:
Snipaste_2023-08-31_19-48-19
本文僅討論非安全狀態。在非安全狀態下,存在3種特權等級(Privilege level):PL0、PL1和PL2,描述如下:
PL0:用戶模式(User mode)運行的應用程序處于PL0特權等級。運行在用戶模式的程序被稱為非特權程序。非特權程序對于系統資源的訪問是受限的,對應Linux的用戶態。
PL1:除了用戶模式和Hyp模式外,其他模式下的程序執行都處于PL1特權等級。PL1模式是指除了用戶模式和Hyp模式之外的其他模式。操作系統運行在PL1特權級。
PL2:如果實現了虛擬化擴展,Hyp模式運行的系統管理程序處于PL2特權等級。系統管理程序將控制并啟用多個操作系統在同一個處理器系統上共存和執行。
處理器模式
ARMv7-A體系結構提供了9種處理器模式,如下圖所示:
Snipaste_2023-09-01_20-59-03
從上圖可以知道ARMv7-A提供的處理器模式有User、FIQ、IRQ、Supervisor(SVC)、Monitor(MON)、Abort(ABT)、Hyp、Undefined(UND)、System(SYS)模式,各個處理器模式的描述如下:
User:用戶模式,用戶程序運行在User模式下,擁有受限的系統資源訪問權限。
FIQ:快中斷異常處理模式,發生FIQ中斷時的處理器模式,相對于中斷而言,快中斷擁有更高的響應等級和更低的延遲。
IRQ:中斷異常處理模式,發生IRQ中斷時的處理器模式。
Supervisor(SVC):管理員模式,操作系統內核通常運行在該模式下,在處理器復位或者應用程序調用svc指令的時候將會進入到該模式,系統調用就是通過svc指令完成的。
Abort(ABT):異常終止模式,當發生Data Abort exception或者Prefetch Abort exception異常的時候進入這個模式。
Undefined(UND):未定義指令模式,當執行未定義指令時進入這個模式。
System(SYS):系統模式,系統模式和用戶模式共享寄存器視圖,并且目前大多數系統未使用該模式,利用這個特性我們可以在處理器啟動時通過設置系統模式的SP寄存器來達到設置用戶模式堆棧的目的,要設置用戶模式的其他寄存器也可以這樣操作。
Monitor(MON):監視模式,實現了安全擴展的處理器才有該模式,在該模式下執行Secure和Non-secure處理器狀態的切換。
Hyp:實現了虛擬化擴展的處理器才有該模式。
User模式處于PL0特權等級。
FIQ、IRQ、Supervisor(SVC)、Monitor(MON)、Abort(ABT)、Undefined(UND)、System(SYS)這些模式處于PL1特權等級。
Hyp模式處于PL2特權等級。
本文不討論支持安全擴展和虛擬化擴展的場景,因此對于Monitor模式和Hyp模式也不做深入探討。
通常情況下,應用程序運行在User模式(PL0),運行在User模式下的應用程序對硬件沒有直接訪問權,所有的硬件操作都需要通過系統調用向內核進行申請。操作系統內核運行在管理員模式(PL1),對系統調用、中斷、異常等系統事件進行響應、處理并返回,以這種硬件隔離的方式保證了操作系統內核的安全。
以Linux操作系統為例,雖然ARMv7-A體系結構的處理器有9種模式,但是操作系統只工作在SVC和USR模式,SVC處于內核態,USR處于用戶態。至于其他的異常模式,Linux只是簡單的略過。比如中斷模式irq,Linux只有很短的匯編代碼在irq模式運行,主要是保存上下文,然后就立馬切換到了SVC模式,由內核進行統一處理。
寄存器集
ARMv7-A體系結構的處理器在不同處理器模式下,對于通用寄存器的使用情況也有所不同,如下圖所示:
Snipaste_2023-09-01_21-20-36
上圖中藍色背景的寄存器屬于bank寄存器,也就是相同的寄存器名對應不同的寄存器實體。從上圖可以看出:
R0~R7,PC在所有模式下是共享的。
系統模式和用戶模式共享寄存器視圖,系統模式沒有bank寄存器。
FIQ 模式下,R8~R12、SP、LR 都是該模式專門的寄存器,FIQ比IRQ響應和處理速度更快,也得益于FIQ模式具有比IRQ模式更多的bank寄存器。
FIQ、IRQ、ABT、SVC和UND模式,都有他們自己模式下專用的SP和LR,也就是說,在模式切換的時候,不需要針對這兩個寄存器進行現場保護和恢復;
FIQ、IRQ、ABT、SVC和UND模式,都有他們自己模式下專用的SPSR。在處理器發生中斷或者異常時,處理器會自動的從一個模式A進入到另一個模式B,模式A的CPSR/APSR將會自動保存到模式B的SPSR中,這樣模式B中的處理程序能夠通過訪問SPSR寄存器得到模式A下CPSR寄存器的信息。
處理器模式切換
ARMv7-A體系結構的處理器,處理器模式是由狀態寄存器CPSR的M域(BIT[4:0])來控制的。對于用戶模式而言,是沒有權限操作CPSR寄存器的M域的,只能通過svc指令進入到SVC模式。對于SYS、FIQ、IRQ、ABT、SVC和UND模式而言,可以通過給CPSR寄存器的M域賦值來達到切換處理器模式的目的。各個模式的編碼如下圖所示:
Snipaste_2023-09-01_20-59-03
下述代碼簡單的演示了處理器模式切換:
Reset_Handler: cpsid i // ... // 切換到IRQ模式,并設置IRQ模式的堆棧 cps #0x12 ldr sp, =0x9FF00000 // 切換到SYS模式,并設置SYS模式的堆棧 // 由于SYS模式和USR模式共享寄存器視圖,SYS模式一般情況下沒有被使用, // 因此這里相當于在設置USR模式的堆棧 cps #0x1f ldr sp, =0x9FE00000 // 切換到SVC模式,并設置SVC模式的堆棧 cps #0x13 ldr sp, =0x9FD00000 // ... cpsie i // ...
在上述代碼中,使用了cps #mode指令來完成處理器模式的切換,在切換到相應模式之后,設置了對應模式的堆棧。
在上述代碼中,為什么不直接切換到USR模式,再設置USR模式的堆棧,而要借助SYS模式來設置USR模式的堆棧呢?這個問題相信大家在學習了本節內容之后,應該還是比較簡單的。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19407瀏覽量
231181 -
ARM
+關注
關注
134文章
9165瀏覽量
369187 -
內核
+關注
關注
3文章
1382瀏覽量
40422 -
操作系統
+關注
關注
37文章
6892瀏覽量
123742
原文標題:ARMv7-A 那些事 - 4.處理器模式與特權等級
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論