作者簡(jiǎn)介
baron (網(wǎng)名:代碼改變世界ctw),九年手機(jī)安全/SOC底層安全開發(fā)經(jīng)驗(yàn)。擅長(zhǎng)trustzone/tee安全產(chǎn)品的設(shè)計(jì)和開發(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、在開機(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í)踐中不常見。所以也許會(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的程序中去寫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)注
134文章
9097瀏覽量
367552 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209496 -
runtime
+關(guān)注
關(guān)注
0文章
17瀏覽量
2173
原文標(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)先 登錄
相關(guān)推薦
評(píng)論