作者簡(jiǎn)介
baron (網(wǎng)名:代碼改變世界ctw),九年手機(jī)安全/SOC底層安全開(kāi)發(fā)經(jīng)驗(yàn)。擅長(zhǎng)trustzone/tee安全產(chǎn)品的設(shè)計(jì)和開(kāi)發(fā)
思考:1、我們知道arm有2個(gè)執(zhí)行狀態(tài):aarch32/aarch64,他們之間是如何跳轉(zhuǎn),如何切換的/2、我們知道arm有4個(gè)安全狀態(tài):secure security/non-secure security/ Root/ Realm,他們之間是如何跳轉(zhuǎn),如何切換的?3、我們知道arm有4個(gè)特權(quán)級(jí)別:secure security/non-secure security,他們之間是如何跳轉(zhuǎn),如何切換的?4、在開(kāi)機(jī)啟動(dòng)是,有著不同的階段,如bootrom、bootloader、kernel,他們都是64位的?他們之間都是怎樣跳轉(zhuǎn)和切換的?5、uboot怎樣切換到Linux Kernel的?
說(shuō)明:1、以下知識(shí)點(diǎn),看似簡(jiǎn)單和清晰,實(shí)則零散在整個(gè)10000多頁(yè)的 ARM TRM之中,另外也有許多理論知識(shí)在實(shí)踐中不常見(jiàn)。所以也許會(huì)有描述不準(zhǔn)確的地方(但但致都是準(zhǔn)確的),精確的學(xué)習(xí)還是請(qǐng)以 ARM TRM官方文檔為準(zhǔn)。2、本文講解的主要是armv8/armv9架構(gòu)。
1、前言
注意本文標(biāo)題所說(shuō)的“程序之間的跳轉(zhuǎn)模型”,主要講解如下這么樣子的大系統(tǒng)大程序之中:

啟動(dòng)時(shí)鏡像之間是如何跳轉(zhuǎn)的
runtime是鏡像之間是如何跳轉(zhuǎn)的
閱讀本文需要一點(diǎn)點(diǎn)基礎(chǔ),請(qǐng)自行補(bǔ)習(xí):
4個(gè)特權(quán)等級(jí)、4個(gè)安全狀態(tài)、2個(gè)執(zhí)行狀態(tài)
啟動(dòng)模型中的BL1 BL2 BL31 BL32 BL33的概念
2、4個(gè)特權(quán)等級(jí)/4個(gè)安全狀態(tài)之間的跳轉(zhuǎn)模型
先弄懂最最最基礎(chǔ)的本質(zhì)原理,10000多頁(yè)的 ARM TRM文檔散裝了很多場(chǎng)景, 我們總結(jié)之后再總結(jié),最后濃縮成了下面這一張框圖,通常我們也只要理解下面這張圖就可以了:

其中:
EL0的所有異常(同步異常和異步異常)都可以將core切到EL1中
EL1的所有異步異常、hvc/smc指令 都可以將core切到EL2中
EL2的所有異步異常、smc指令 都可以將core切到EL3中
所有的返回指令,都是ERET
其實(shí)呢,下面這種情況也是可以出現(xiàn)的,(只不過(guò)呢查略大多數(shù)代碼,我都沒(méi)有找到這樣使用的例子)

另外呢svc也是可以被trapped到EL2的,EL3調(diào)用ERET返回EL1時(shí),也是可以被EL2 trapped的,即下面這種情況也是可以出現(xiàn)的, (只不過(guò)呢查略大多數(shù)代碼,我也沒(méi)有找到這樣使用的例子)

3、啟動(dòng)時(shí)鏡像之間的跳轉(zhuǎn)模型
由于這些底層的東西,都會(huì)和具體的SOC廠家的設(shè)計(jì)強(qiáng)相關(guān),所以我們也就只好介紹common的場(chǎng)景。
很多人都學(xué)習(xí)過(guò)Secure Boot或是即將學(xué)習(xí)Secure boot,他們的重點(diǎn)也許都放在了如何簽名驗(yàn)簽的地方。那么你知道BL1到BL2是怎樣跳轉(zhuǎn)?uboot到kernel是怎樣跳轉(zhuǎn)的嗎?
以下是參在TF-A代碼做出的總結(jié),當(dāng)然了也是比較理想的場(chǎng)景:

可是在你的實(shí)際使用中:
BL32可能不是S-EL1,也是有可能是S-EL2的
BL33可能不是EL1,也是有可能是EL2的
BL1 BL2 BL33 BL32 BL33 每一級(jí)鏡像,也許不是aarch64的,也許是aarch32的
如上的場(chǎng)景中,看似也就那么回事吧,無(wú)非就是不同特權(quán)等級(jí)之間,調(diào)用同步異常指令或返回指令,切來(lái)切去而已。那么如果是相同的特權(quán)等級(jí),那么如何切換呢?
如uboot(EL1)到kernel(EL1), 至少有以下三種方式(其實(shí)我還能列出第4種第5種,這里留給大家思考):

如下再展示了一個(gè)稍微復(fù)雜的場(chǎng)景,aarch64和aarch32摻雜地使用,也許你的SOC就是這樣設(shè)計(jì)的哦:

4、runtime程序之間的跳轉(zhuǎn)模型

在runtime模型中,你的cpu可能會(huì)同時(shí)在aarch32和aarch64之間運(yùn)行,aarch32和aarch64之間的切換,其實(shí)也很好理解,模型如下所示,就是進(jìn)入高特權(quán)等級(jí),切換一下cpu context而已。

燃鵝,以上依然是最理想的場(chǎng)景吧。在實(shí)際使用中,也許你會(huì)有各種各樣的需求,例如:我不想跳轉(zhuǎn)特權(quán)等級(jí),但還想切換執(zhí)行狀態(tài)。比如你的SOC實(shí)現(xiàn)定義了EL3,你的EL3既aarch32的程序,也有aarch64的程序,那么兩個(gè)程序是如何切換的呢?

這個(gè)時(shí)候,利用同步異常/異步異常的知識(shí)點(diǎn)已經(jīng)無(wú)法滿足需求了,可能就得利用架構(gòu)中的warm reset技術(shù)了。例如,你可以在aarch32的程序中去寫(xiě)RMREL3的相關(guān)比特,觸發(fā)warm reset, cpu復(fù)位進(jìn)入提前設(shè)置好的RVBAREL3的地址出,進(jìn)入aarch64程序。其實(shí)還真有很多廠家,使用這種方式完成的鏡像之間的跳轉(zhuǎn)。
原文標(biāo)題:armv8/armv9不同特權(quán)程序之間的跳轉(zhuǎn)模型
文章出處:【微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
ARM
+關(guān)注
關(guān)注
135文章
9552瀏覽量
391825 -
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219005 -
runtime
+關(guān)注
關(guān)注
0文章
17瀏覽量
2395
原文標(biāo)題:armv8/armv9不同特權(quán)程序之間的跳轉(zhuǎn)模型
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Arm下一代指令架構(gòu)“Armv9”已經(jīng)問(wèn)世
ARM重新定義ARMv8新架構(gòu),ARMv8新架構(gòu)特性解說(shuō)
ARMV8/ARMV9為什么會(huì)有執(zhí)行狀態(tài)的切換呢?
ARMv8架構(gòu)資料分享
ARMv8架構(gòu)的兩種執(zhí)行狀態(tài)分別是什么
在armv8架構(gòu)中Arch32切換到Arch64是如何運(yùn)作的
ARM Cortex-A系列ARMv8-A程序員指南
重磅!Arm正式推出Armv9架構(gòu)
淺談ARM發(fā)布Armv9的三大改進(jìn)
Arm微架構(gòu)之Armv9時(shí)代
Armv8架構(gòu)和Armv9架構(gòu)的區(qū)別分析
Armv9與Armv8服務(wù)器有何不同
Armv8架構(gòu)及虛擬化介紹
ARMv8工作模式有哪些
armv8/armv9的執(zhí)行狀態(tài)的跳轉(zhuǎn)和切換
評(píng)論