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

ARM處理器7種工作模式介紹
從Cortex-M到Cortex-A認(rèn)識(shí)ARM處理器
ARM中的異常和特權(quán)是怎樣去定義的
淺析ARMv7-A體系架構(gòu)下的MMU的基本原理
Cortex-A9處理器技術(shù)參考手冊(cè)
ARM體系結(jié)構(gòu)參考手冊(cè)ARMv7-A和ARMv7-R版本
基于ARMv8-M處理器的安全堆疊密封
ARM Cortex-A15 MPCore處理器參考手冊(cè)
ARMv8-A處理器的裸機(jī)引導(dǎo)代碼
如何將軟件應(yīng)用程序從ARMv5遷移到ARMv7-A/R
Cortex-A15高性能工業(yè)控制處理器的技術(shù)參考手冊(cè)

ARMv7和ARMv7的體系結(jié)構(gòu)參考手冊(cè)免費(fèi)下載

Cortex A7 MPCore的技術(shù)參考手冊(cè)

ARMv7-A工作模式介紹

評(píng)論