思想解读:TF-A(ATF)中栈指针和栈内存的设计思想解读
生活随笔
收集整理的這篇文章主要介紹了
思想解读:TF-A(ATF)中栈指针和栈内存的设计思想解读
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
說明:
在默認(rèn)情況下,本文講述的都是armv9/armv8-aarch64架構(gòu),TF-A 2.4版本
本文不貼復(fù)雜的代碼,以直接寫答案的方式,圖文總結(jié)
思考:
什么是棧? 什么是棧內(nèi)存?什么是棧指針? 一個系統(tǒng)里有多少棧內(nèi)存?有多少棧指針?
做為一名軟件工程師、嵌入式工程師,不管底層上層,在工作中多多少少都會談到"棧"這個字,那么何為棧呢? 你真的懂和理解嗎?啥又是棧指針?棧內(nèi)存?
本文就以armv8/armv8的aarch64體系、TF-A(ATF)代碼為示例,以直接寫出答案的方案來總結(jié):棧指針和棧內(nèi)存的基本概念。
1、首先講解一下aarch64的狀態(tài)下,有哪些SP寄存器,非常簡單:
- SP_EL0 //當(dāng)spsel == 0,高的級別訪問的sp就是sp_el0
- SP_EL1 //在EL1級別下使用,且spsel == 1,此時sp就說sp_el1
- SP_EL2 //在EL2級別下使用,且spsel == 1,此時sp就說sp_el2
- SP_EL3 //在EL3級別下使用,且spsel == 1,此時sp就說sp_el3
注意注意注意:并不是說"SP_EL0給EL0使用的,SP_EL1給EL1使用的",也不能說“userspace用SP_EL0, kernel使用SP_EL1” , 誰要是再這么說誰就是小烏龜,救不了你了。
2、接下來我們再總結(jié)SP_EL3以及它指向的棧內(nèi)存
- 在boot階段階段、cpu_on階段,事實上是用不到SP_EL3的,因為在bl31_entrypoint和bl31_warm_entrypoint 中,就直接將SP切到SP_EL0了
- 在編譯的時候,為每一個cpu、每一種security狀態(tài)都分配了一個靜態(tài)數(shù)組cpu_context,在PE從ATF退出的時候,此時會設(shè)置SP_EL3指向cpu_context,所以在下一次的smc/fiq/irq/abort等方式進(jìn)入ATF時,就可以直接使用SP來恢復(fù)寄存器了(此時SP為SP_EL3,指向cpu_context)
3、再接下來介紹SP_EL0了以及它指向的棧內(nèi)存:
- 在cpu初始化的時候,在el3_entrypoint_common會為該cpu初始化一個棧內(nèi)存,并讓SP_EL0指向這塊內(nèi)存,sp也切換到SP_EL0
- 在ATF退出的時候,會SP_EL0的值保存下來,保存到了(cpu_context->el3state_ctx:CTX_RUNTIME_SP) 中, 等到再次從firq/fiq/serror/smc切換回來時,再恢復(fù)。
總結(jié)
以上是生活随笔為你收集整理的思想解读:TF-A(ATF)中栈指针和栈内存的设计思想解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TF-A代码阅读: SP_EL3栈内存-
- 下一篇: Beyond Compare4长期使用方