CA/TA通信的share memory设计思想解读
引流關(guān)鍵詞: WSM, 共享內(nèi)存,sharememory,share memory, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內(nèi)存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構(gòu),linux kernel 5.14, optee3.14
思考:
CA/TA之間的share memroy是怎樣實現(xiàn)的?
Linux Kernel和TEE os之間的share memory呢?
TA和TA之間的Share memory呢?
CA/TA之間的共享內(nèi)存有多大?
經(jīng)常開發(fā)CA/TA的同學(xué),對待共享內(nèi)存這個概念既熟悉又陌生,熟悉在于能夠熟練的使用各類API,也知道共享內(nèi)存這個東西,陌生在于他講不出共享內(nèi)存的根本原理。
也許會有同學(xué)深入專研這一部分代碼,每次看得都很深,可每一次又都是似懂非懂…
也許是因為共享內(nèi)存中間的架構(gòu)(或說業(yè)務(wù)或說設(shè)計層)太過于復(fù)雜,又和底層的MMU/Cache相關(guān)聯(lián),但是萬變不離其宗,我們拋開一切業(yè)務(wù)/設(shè)計,去追溯底層的根本思想,發(fā)現(xiàn)其實這就是這么回事。
本文就不再探討深入的設(shè)計方法和技術(shù)原理,以直接寫出答案的方式,透過事務(wù)看本質(zhì),告訴您啥是共享內(nèi)存,搬好小板凳坐好了哈
1、構(gòu)建一塊共享內(nèi)存,其實就是從DDR中挖出一個區(qū)域(也可能是多塊內(nèi)存區(qū)域),CA/TA都可以能訪問此區(qū)域;
2、在optee社區(qū)的設(shè)計思想中,共享內(nèi)存有兩種,靜態(tài)的和動態(tài)的。
3、什么是靜態(tài)的共享內(nèi)存? optee os啟動的時候,在optee os中注冊一塊內(nèi)存(如10M空間),做為共享內(nèi)存? 啥叫注冊一塊內(nèi)存? 其實就是將這一塊內(nèi)存的物理地址,交給MMU管理,也就是說將這塊內(nèi)存的信息(addr,size,attributes)寫入到MMU頁表中。另外在Linux Kernel的tee driver程序module_init時,也會將這塊物理地址map到Kernel中, 啥是map呢?其實就是將這塊物理內(nèi)存交給Linux Kernel中的MMU管理,即將這塊內(nèi)存的信息(addr,size,attributes)寫入到Linux Kernel的MMU頁表中。 那么CA中是如何使用這塊共享內(nèi)存呢? CA中使用之前,會調(diào)用mmap,將這塊內(nèi)存又重新map到Userspace空間,然后CA就可以直接使用了。optee在將控制權(quán)交給TA之前,也會將改內(nèi)存加入到TA的頁表項中,所以TA也就能使用了。
這種設(shè)計應(yīng)該是最簡單的,是提前在TEE側(cè)和REE側(cè)約定好的一塊共享內(nèi)存,是一塊連續(xù)的內(nèi)存。只需要在兩邊同時map即可。
4、什么是動態(tài)的共享內(nèi)存? 為啥要搞出動態(tài)共享內(nèi)存? 那肯定是因為靜態(tài)的不好,靜態(tài)的為啥不好? 浪費內(nèi)存唄,不管你用不用,它都挖出了一塊區(qū)域。那我們講下動態(tài)的。
動態(tài)的共享內(nèi)存,核心思想就是在使用的時候分配。動態(tài)共享內(nèi)存有多種形式,我們就講下optee社區(qū)設(shè)計的,我把它們歸納后,可分為3類:
- 在CA/TA通信之前,分配一塊內(nèi)存,然后到TEE種注冊一下。這里可以是userspace分配的內(nèi)存,也可以是Linux Kernel分配的內(nèi)存.
- 在CA/TA通信之前,從Linux Kernel分配一塊內(nèi)存,然后CA到TA的api調(diào)用時,TEE OS檢查該內(nèi)存在TEE側(cè)還未map,此時TEE會map一下; 同時Kernel層也會將這塊內(nèi)存信息返回給CA端,CA端再調(diào)用mmap重新map下這塊內(nèi)存。
- 在CA/TA通信時,從Userspace分配一塊內(nèi)存,到Linux Kernel中后會這這塊內(nèi)存轉(zhuǎn)換為物理地址,因為userspace分配的內(nèi)存在物理上不一定是連續(xù)的,所以轉(zhuǎn)換物理地址后可能是很多區(qū)域,是散列值。然后會將這些散列值傳給TEE,TEE再map這些內(nèi)存. 其實每家TEE廠商的實現(xiàn),也都略有不同,但最終的思想都是一致的,即REE/TEE側(cè)同時map這塊物理內(nèi)存。下面一張示例圖,就是本種方式的示意圖
然后我們再來個小小的總結(jié):
拋開事務(wù)看本質(zhì),共享內(nèi)存的建立,其實就是選定好一塊(或多塊)內(nèi)存,然后同時在兩個系統(tǒng)(TEE 、REE)中做mmu map。這樣的話,兩個系統(tǒng)就都能使用這塊內(nèi)存了。
總結(jié)
以上是生活随笔為你收集整理的CA/TA通信的share memory设计思想解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TEEC_AllocateSharedM
- 下一篇: [architecture]-ARMV8