0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

armv8/armv9的執(zhí)行狀態(tài)的跳轉(zhuǎn)和切換

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:baron ? 2022-05-16 09:54 ? 次閱讀

作者簡(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)大程序之中:

5c6f4804-d4ac-11ec-bce3-dac502259ad0.png

啟動(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é),最后濃縮成了下面這一張框圖,通常我們也只要理解下面這張圖就可以了:

5cc5de9e-d4ac-11ec-bce3-dac502259ad0.png

其中:

EL0的所有異常(同步異常和異步異常)都可以將core切到EL1中

EL1的所有異步異常、hvc/smc指令 都可以將core切到EL2中

EL2的所有異步異常、smc指令 都可以將core切到EL3中

所有的返回指令,都是ERET

其實(shí)呢,下面這種情況也是可以出現(xiàn)的,(只不過(guò)呢查略大多數(shù)代碼,我都沒(méi)有找到這樣使用的例子)

5d1b1350-d4ac-11ec-bce3-dac502259ad0.png

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

5d3f530a-d4ac-11ec-bce3-dac502259ad0.png

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)景:

5d988560-d4ac-11ec-bce3-dac502259ad0.png

可是在你的實(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種,這里留給大家思考):

5db45844-d4ac-11ec-bce3-dac502259ad0.png

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

5e043396-d4ac-11ec-bce3-dac502259ad0.png

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

5e3bff7e-d4ac-11ec-bce3-dac502259ad0.png

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

5e5cd668-d4ac-11ec-bce3-dac502259ad0.png

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

5e850bce-d4ac-11ec-bce3-dac502259ad0.png

這個(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)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Arm下一代指令架構(gòu)“Armv9”已經(jīng)問(wèn)世

    Arm的下一代CPU指令集架構(gòu)(ISA:指令集架構(gòu)) Armv9開始推出。該公司正在逐步擴(kuò)展當(dāng)前的ISA Armv8,而擴(kuò)展的高潮最終將成為Armv9的搭建橋梁。至于Armv9,一位C
    的頭像 發(fā)表于 11-13 11:55 ?4.4w次閱讀

    ARM重新定義ARMv8新架構(gòu),ARMv8新架構(gòu)特性解說(shuō)

    本文從ARMv8-A產(chǎn)生的背景開始,對(duì)它進(jìn)行一個(gè)簡(jiǎn)單的介紹,使大家從整體上,對(duì)ARMv8有一個(gè)簡(jiǎn)單的了解。
    的頭像 發(fā)表于 10-08 17:02 ?1.1w次閱讀
    ARM重新定義<b class='flag-5'>ARMv8</b>新架構(gòu),<b class='flag-5'>ARMv8</b>新架構(gòu)特性解說(shuō)

    ARMV8/ARMV9為什么會(huì)有執(zhí)行狀態(tài)切換呢?

    在一個(gè)大系統(tǒng)中,我們所說(shuō)這它是64位的,還是32位的,往往說(shuō)的是kernel內(nèi)核。
    發(fā)表于 09-08 15:40 ?839次閱讀
    <b class='flag-5'>ARMV8</b>/<b class='flag-5'>ARMV9</b>為什么會(huì)有<b class='flag-5'>執(zhí)行狀態(tài)</b>的<b class='flag-5'>切換</b>呢?

    ARMv8架構(gòu)資料分享

    ,大大提升了處理器的性能。從目前的的了解來(lái)看,基本上 ARMv8 與上代架構(gòu)的差別是非常大的。除了 A64 指令集之外,還有許多地方都有較大改動(dòng),下面列出幾個(gè)目前比較關(guān)注的點(diǎn):  · 執(zhí)行狀態(tài)與異常級(jí)別
    發(fā)表于 03-21 14:50

    ARMv8架構(gòu)的兩種執(zhí)行狀態(tài)分別是什么

    、A64與A32的切換對(duì)于A32來(lái)說(shuō),ARM和thumb的切換,通過(guò)bx指令即可切換。但是對(duì)于A64和A32兩種執(zhí)行狀態(tài),只能通過(guò)異常,進(jìn)行切換
    發(fā)表于 04-06 10:49

    armv8架構(gòu)中Arch32切換到Arch64是如何運(yùn)作的

    各位大神,armv8架構(gòu)中,如果Arch32要去切換到Arch64,是如何運(yùn)作的?狀態(tài)會(huì)清空嗎?
    發(fā)表于 06-06 16:13

    ARM Cortex-A系列ARMv8-A程序員指南

    ARMv8-A是針對(duì)應(yīng)用配置文件的最新一代ARM架構(gòu)。 在本書中,名稱ARMv8用于描述整個(gè)體系結(jié)構(gòu),它現(xiàn)在包括32位執(zhí)行狀態(tài)和64位執(zhí)行狀態(tài)。 A
    發(fā)表于 08-22 07:22

    重磅!Arm正式推出Armv9架構(gòu)

    V8架構(gòu)發(fā)布于2011年10月。 Arm首席執(zhí)行官Simon Segars說(shuō):“當(dāng)我們預(yù)測(cè)到AI將定義未來(lái)時(shí),我們必須為領(lǐng)先的計(jì)算打下基礎(chǔ),為即將到來(lái)的獨(dú)特挑戰(zhàn)做好準(zhǔn)備?!?“Armv9將處于下一個(gè)3000億Arm芯片的最前沿,
    發(fā)表于 03-31 09:43 ?2639次閱讀
    重磅!Arm正式推出<b class='flag-5'>Armv9</b>架構(gòu)

    淺談ARM發(fā)布Armv9的三大改進(jìn)

    英國(guó)芯片設(shè)計(jì)公司Arm周二發(fā)布了Armv9,這是其在2011年發(fā)布Armv8之后十年來(lái)首次推出新的芯片架構(gòu)。Arm表示,與以前的架構(gòu)相比,Armv9提供了三大主要改進(jìn),即安全性更高,更好的AI性能,以及總體上速度更快。
    的頭像 發(fā)表于 04-01 15:17 ?2348次閱讀

    Arm微架構(gòu)之Armv9時(shí)代

    在介紹Armv9系列前,我們先看一下ARM的Cortex-X定制CPU計(jì)劃。Cortex-X方案先于Armv9發(fā)布,在Arm發(fā)布A78時(shí),同時(shí)也發(fā)布了Cortex-X1這一顆性能強(qiáng)大的CPU,后續(xù)大家習(xí)慣稱之為超級(jí)大核。
    的頭像 發(fā)表于 02-06 14:43 ?9095次閱讀

    Armv8架構(gòu)和Armv9架構(gòu)的區(qū)別分析

    新的Armv9兼容CPU所承諾的最大的新功能可能是開發(fā)人員和用戶可以立即看到的——SVE2作為NEON的后繼產(chǎn)品。
    發(fā)表于 03-10 14:02 ?4812次閱讀

    Armv9Armv8服務(wù)器有何不同

    新的Armv9兼容CPU所承諾的最大的新功能可能是開發(fā)人員和用戶可以立即看到的——SVE2作為NEON的后繼產(chǎn)品。 可伸縮矢量擴(kuò)展(SVE)的于2016年首次亮相,并首次在富士通的A64FX CPU內(nèi)核中實(shí)現(xiàn),該芯片已為日本排名第一的超級(jí)計(jì)算機(jī)Fukagu提供支持。
    發(fā)表于 03-29 14:02 ?753次閱讀

    Armv8架構(gòu)及虛擬化介紹

    ARMv8基本概念 (1)執(zhí)行狀態(tài)(execution state):處理器運(yùn)行時(shí)的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理及編程模型等。ARMv8體系結(jié)構(gòu)定義了兩個(gè)執(zhí)行
    的頭像 發(fā)表于 04-16 10:45 ?6474次閱讀

    ARMv8工作模式有哪些

    ),虛擬機(jī)管理器 EL3:最底層的安全固件,如 ARM Trusted Firmware(ATF/TF-A) ARMv8 提供了兩種安全狀態(tài):Secure 和 Non-secure,也就是安全和非安全,Non-secure 也就是正常
    的頭像 發(fā)表于 09-11 16:34 ?1491次閱讀
    <b class='flag-5'>ARMv8</b>工作模式有哪些

    u-boot armv8鏈接腳本

    u-boot armv8鏈接腳本 在進(jìn)行源碼分析之前,首先看看u-boot的鏈接腳本,通過(guò)鏈接腳本可以從整體了解一個(gè)u-boot的組成,并且可以在啟動(dòng)分析中知道某些邏輯是在完成什么工作。 在
    的頭像 發(fā)表于 12-07 11:19 ?682次閱讀