作者簡介
baron (網(wǎng)名:代碼改變世界ctw),九年手機安全/SOC底層安全開發(fā)經(jīng)驗。擅長trustzone/tee安全產(chǎn)品的設(shè)計和開發(fā)
思考:1、我們知道arm有2個執(zhí)行狀態(tài):aarch32/aarch64,他們之間是如何跳轉(zhuǎn),如何切換的/2、我們知道arm有4個安全狀態(tài):secure security/non-secure security/ Root/ Realm,他們之間是如何跳轉(zhuǎn),如何切換的?3、我們知道arm有4個特權(quán)級別:secure security/non-secure security,他們之間是如何跳轉(zhuǎn),如何切換的?4、在開機啟動是,有著不同的階段,如bootrom、bootloader、kernel,他們都是64位的?他們之間都是怎樣跳轉(zhuǎn)和切換的?5、uboot怎樣切換到Linux Kernel的?
說明:1、以下知識點,看似簡單和清晰,實則零散在整個10000多頁的 ARM TRM之中,另外也有許多理論知識在實踐中不常見。所以也許會有描述不準(zhǔn)確的地方(但但致都是準(zhǔn)確的),精確的學(xué)習(xí)還是請以 ARM TRM官方文檔為準(zhǔn)。2、本文講解的主要是armv8/armv9架構(gòu)。
1、前言
注意本文標(biāo)題所說的“程序之間的跳轉(zhuǎn)模型”,主要講解如下這么樣子的大系統(tǒng)大程序之中:
啟動時鏡像之間是如何跳轉(zhuǎn)的
runtime是鏡像之間是如何跳轉(zhuǎn)的
閱讀本文需要一點點基礎(chǔ),請自行補習(xí):
4個特權(quán)等級、4個安全狀態(tài)、2個執(zhí)行狀態(tài)
啟動模型中的BL1 BL2 BL31 BL32 BL33的概念
2、4個特權(quán)等級/4個安全狀態(tài)之間的跳轉(zhuǎn)模型
先弄懂最最最基礎(chǔ)的本質(zhì)原理,10000多頁的 ARM TRM文檔散裝了很多場景, 我們總結(jié)之后再總結(jié),最后濃縮成了下面這一張框圖,通常我們也只要理解下面這張圖就可以了:
其中:
EL0的所有異常(同步異常和異步異常)都可以將core切到EL1中
EL1的所有異步異常、hvc/smc指令 都可以將core切到EL2中
EL2的所有異步異常、smc指令 都可以將core切到EL3中
所有的返回指令,都是ERET
其實呢,下面這種情況也是可以出現(xiàn)的,(只不過呢查略大多數(shù)代碼,我都沒有找到這樣使用的例子)
另外呢svc也是可以被trapped到EL2的,EL3調(diào)用ERET返回EL1時,也是可以被EL2 trapped的,即下面這種情況也是可以出現(xiàn)的, (只不過呢查略大多數(shù)代碼,我也沒有找到這樣使用的例子)
3、啟動時鏡像之間的跳轉(zhuǎn)模型
由于這些底層的東西,都會和具體的SOC廠家的設(shè)計強相關(guān),所以我們也就只好介紹common的場景。
很多人都學(xué)習(xí)過Secure Boot或是即將學(xué)習(xí)Secure boot,他們的重點也許都放在了如何簽名驗簽的地方。那么你知道BL1到BL2是怎樣跳轉(zhuǎn)?uboot到kernel是怎樣跳轉(zhuǎn)的嗎?
以下是參在TF-A代碼做出的總結(jié),當(dāng)然了也是比較理想的場景:
可是在你的實際使用中:
BL32可能不是S-EL1,也是有可能是S-EL2的
BL33可能不是EL1,也是有可能是EL2的
BL1 BL2 BL33 BL32 BL33 每一級鏡像,也許不是aarch64的,也許是aarch32的
如上的場景中,看似也就那么回事吧,無非就是不同特權(quán)等級之間,調(diào)用同步異常指令或返回指令,切來切去而已。那么如果是相同的特權(quán)等級,那么如何切換呢?
如uboot(EL1)到kernel(EL1), 至少有以下三種方式(其實我還能列出第4種第5種,這里留給大家思考):
如下再展示了一個稍微復(fù)雜的場景,aarch64和aarch32摻雜地使用,也許你的SOC就是這樣設(shè)計的哦:
4、runtime程序之間的跳轉(zhuǎn)模型
在runtime模型中,你的cpu可能會同時在aarch32和aarch64之間運行,aarch32和aarch64之間的切換,其實也很好理解,模型如下所示,就是進入高特權(quán)等級,切換一下cpu context而已。
燃鵝,以上依然是最理想的場景吧。在實際使用中,也許你會有各種各樣的需求,例如:我不想跳轉(zhuǎn)特權(quán)等級,但還想切換執(zhí)行狀態(tài)。比如你的SOC實現(xiàn)定義了EL3,你的EL3既aarch32的程序,也有aarch64的程序,那么兩個程序是如何切換的呢?
這個時候,利用同步異常/異步異常的知識點已經(jīng)無法滿足需求了,可能就得利用架構(gòu)中的warm reset技術(shù)了。例如,你可以在aarch32的程序中去寫RMREL3的相關(guān)比特,觸發(fā)warm reset, cpu復(fù)位進入提前設(shè)置好的RVBAREL3的地址出,進入aarch64程序。其實還真有很多廠家,使用這種方式完成的鏡像之間的跳轉(zhuǎn)。
原文標(biāo)題:armv8/armv9不同特權(quán)程序之間的跳轉(zhuǎn)模型
文章出處:【微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
ARM
+關(guān)注
關(guān)注
134文章
9180瀏覽量
369437 -
Linux
+關(guān)注
關(guān)注
87文章
11351瀏覽量
210504 -
runtime
+關(guān)注
關(guān)注
0文章
17瀏覽量
2193
原文標(biāo)題:armv8/armv9不同特權(quán)程序之間的跳轉(zhuǎn)模型
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Arm下一代指令架構(gòu)“Armv9”已經(jīng)問世
ARMV8/ARMV9為什么會有執(zhí)行狀態(tài)的切換呢?
![<b class='flag-5'>ARMV8</b>/<b class='flag-5'>ARMV9</b>為什么會有<b class='flag-5'>執(zhí)行狀態(tài)</b>的<b class='flag-5'>切換</b>呢?](https://file1.elecfans.com/web2/M00/A3/99/wKgaomT6z76AVRIYAAK8SaZ3MjM051.jpg)
ARMv8架構(gòu)資料分享
ARMv8架構(gòu)的兩種執(zhí)行狀態(tài)分別是什么
在armv8架構(gòu)中Arch32切換到Arch64是如何運作的
ARM Cortex-A系列ARMv8-A程序員指南
重磅!Arm正式推出Armv9架構(gòu)
![重磅!Arm正式推出<b class='flag-5'>Armv9</b>架構(gòu)](https://file.elecfans.com/web1/M00/E7/C3/o4YBAGBj1OGAFtKvAAJlx-Ynmr8450.png)
淺談ARM發(fā)布Armv9的三大改進
Arm微架構(gòu)之Armv9時代
Armv8架構(gòu)和Armv9架構(gòu)的區(qū)別分析
Armv9與Armv8服務(wù)器有何不同
Armv8架構(gòu)及虛擬化介紹
ARMv8工作模式有哪些
![<b class='flag-5'>ARMv8</b>工作模式有哪些](https://file1.elecfans.com/web2/M00/A2/7F/wKgZomT-0EqAL7JbAAG-d1XnjV4331.jpg)
評論