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