20-Granule Protection Tables Library
引流關鍵詞: 中斷、同步異常、異步異常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
[專欄目錄]-ATF/FF-A/specification學習
20.顆粒保護表庫
本文檔描述了 Trusted Firmware-A (TF-A) 使用的顆粒保護表 (GPT) 庫的設計。該庫提供基于包含系統內存布局信息的數據結構初始化 GPT、配置系統寄存器以啟用基于這些表的顆粒保護檢查以及在運行時在不同 PAS(物理地址空間)之間轉換顆粒所需的 API .
Arm CCA 添加了兩種新的安全狀態,總共四種:root、realm、secure 和 non-secure。除了新的安全狀態外,還添加了相應的物理地址空間來控制每個狀態的內存訪問。下表中可以看到允許對每個安全狀態的 PAS 訪問。
GPT 可以用作 1 級或 2 級查找,具體取決于 PAS 區域的配置方式。第一步是0級表,0級表中的每個條目控制對內存中相對較大的區域(塊描述符)的訪問,當使用單步映射時,整個區域可以屬于單個PAS,或者0 級條目可以鏈接到 1 級表,其中相對較小的內存區域(顆粒)可以通過 2 步映射分配給不同的 PAS。每個 PAS 使用的映射類型由用戶在設置配置結構時確定。
20.1。設計概念和界面
本節介紹 GPT 庫中使用的一些重要概念和數據結構。
決定表的組織方式和功能的三個主要參數:PPS(受保護的物理空間)是系統中受保護的物理地址空間的總量,PGS(物理顆粒大小)是每個級別 1 顆粒的大小是,以及 L0GPTSZ(0 級 GPT 大小),它確定每個 0 級條目控制多少物理內存。顆粒是可以獨立分配給 PAS 的最小內存單元。
L0GTSZ 由硬件決定,從 GPCCR_EL3 寄存器中讀取。PPS 和 PGS 在運行時傳遞到 API 中,可以通過某種算法或固件中的硬編碼以最適合給定平臺的任何方式確定。
GPT 設置分為兩部分:表創建和運行時初始化。在表創建步驟中,包含有關所需 PAS 區域信息的數據結構被傳遞到庫中,該庫驗證映射,在內存中創建表,并啟用顆粒保護檢查。在運行時初始化步驟中,運行時固件使用 GPT 寄存器配置定位內存中的現有表,并將重要數據保存到粒度轉換服務使用的結構中,這將在下面詳細介紹。
在 FVP 模型的參考實現中,您可以在文件中找到 PAS 區域定義的示例include/plat/arm/common/arm_pas_def.h。表創建 API 調用可以在 中找到plat/arm/common/arm_bl2_setup.c,運行時初始化 API 調用可以在 中 找到plat/arm/common/arm_bl31_setup.c。
20.1.1。定義 PAS 區域
結構是一種pas_region_t表示物理地址空間及其屬性的方法,GPT 庫可以使用它來初始化表。
該結構由以下部分組成:
-
(1) 基本物理地址
-
(2) 區域大小
-
(3) 此內存區域的所需屬性(映射類型、PAS 類型)
請參閱 中的pas_region_t類型include/lib/gpt_rme/gpt_rme.h。
程序員應該為 API 提供一個包含結構的數組pas_region_t ,然后庫將檢查所需的內存訪問布局的有效性并創建表來實現它。
pas_region_t是一種公共類型,但是建議使用宏 GPT_MAP_REGION_BLOCK和GPT_MAP_REGION_GRANULE來填充這些結構,而不是手動填充,以減少將來出現兼容性問題的風險。這些宏將基本物理地址、區域大小和 PAS 類型作為參數來生成 pas_region_t 結構。顧名思義,GPT_MAP_REGION_BLOCK僅使用 L0 映射 GPT_MAP_REGION_GRANULE創建區域,同時使用 L0 和 L1 映射創建區域。
20.1.2. 0 級和 1 級表
GPT 初始化 API 需要為要構建的表傳入內存,gpt_init_l0_tables獲取內存地址和大小來構建級別 0 表,并gpt_init_pas_l1_tables獲取地址和大小來構建從級別 0 描述符鏈接的級別 1 表。這些表應該具有 PAS 類型GPT_GPI_ROOT,典型的系統可能會將其 0 級表放在 SRAM 中,將其 1 級表放在 DRAM 中。
20.1.3. 顆粒轉化服務
Granule Transition Service 允許使用 SMC 調用更改使用 GPT_MAP_REGION_GRANULE 所有權映射的內存。非安全顆??梢赞D換到領域或安全空間,領域和安全顆粒可以轉換回非安全。此庫僅允許轉換為顆粒的內存映射,映射為塊的內存在表創建后固定其 GPI。
20.2. 庫 API
可以在中找到公共 API 和類型include/lib/gpt_rme/gpt_rme.h,本節旨在提供更多詳細信息和說明。
要創建 GPT 并啟用粒度保護檢查,需要在系統啟動過程中以正確的順序和正確的時間調用 API。
-
(1) 固件必須啟用 MMU。
-
(2) 固件必須調用gpt_init_l0_tables以將 0 級表初始化為默認狀態,即初始化所有 L0 描述符以允許對所有內存的所有訪問。PPS 作為參數提供給此函數。
-
(3) DDR 由系統發現和初始化,然后將發現的 DDR 區域添加到 L1 PAS 區域以在下一步中初始化并由 GTSI 在運行時使用。
-
(4) 固件必須使用指向包含所需內存訪問布局的結構gpt_init_pas_l1_tables數組的指針進行 調用。pas_region_tPGS 作為參數提供給該函數。
-
(5) 固件必須調用gpt_enable以通過設置正確的寄存器值來啟用顆粒保護檢查。
-
(6) 在使用粒度轉換服務的系統中,運行時固件必須調用gpt_runtime_init以設置 GTSI 所需的數據結構,以查找 PAS 類型之間的表和轉換粒度。
20.2.1. API 約束
API 允許的 PPS 和 PGS 值是文件中定義的枚舉類型include/lib/gpt_rme/gpt_rme.h。
PPS 的允許值及其相應的大小。
- GPCCR_PPS_4GB(4GB 保護空間,0x100000000 字節)
- GPCCR_PPS_64GB(64GB 保護空間,0x1000000000 字節)
- GPCCR_PPS_1TB(1TB 保護空間,0x10000000000 字節)
- GPCCR_PPS_4TB(4TB 保護空間,0x40000000000 字節)
- GPCCR_PPS_16TB(16TB 保護空間,0x100000000000 字節)
- GPCCR_PPS_256TB(256TB 保護空間,0x1000000000000 字節)
- GPCCR_PPS_4PB(4PB 保護空間,0x10000000000000 字節)
PGS 的允許值及其相應的大小。
- GPCCR_PGS_4K(4KB 顆粒,0x1000 字節)
- GPCCR_PGS_16K(16KB 顆粒,0x4000 字節)
- GPCCR_PGS_64K(64KB 顆粒,0x10000 字節)
L0GPTSZ 的允許值以及相應的大小。
- GPCCR_L0GPTSZ_30BITS(1GB 區域,0x40000000 字節)
- GPCCR_L0GPTSZ_34BITS(16GB 區域,0x400000000 字節)
- GPCCR_L0GPTSZ_36BITS(64GB 區域,0x1000000000 字節)
- GPCCR_L0GPTSZ_39BITS(512GB 區域,0x8000000000 字節)
請注意,PPS、PGS 和 L0GPTSZ 定義的值是與大小相對應的編碼值,而不是大小本身。為方便起見,提供了大小的解碼十六進制表示。
L0 表內存有一些必須考慮的約束。
-
L0 表必須與表大小或 4096 字節對齊,以較大者為準。L0 表大小是總保護空間 (PPS) 除以每個 L0 區域 (L0GPTSZ) 的大小乘以每個 L0 描述符的大小(8 字節)。((PPS / L0GPTSZ) * 8)
-
L0 內存大小必須大于或等于表大小。
-
L0 內存必須屬于 GPT_GPI_ROOT 類型的 PAS。
L1 內存也有一些限制。
-
L1 表必須與其大小對齊。每個 L1 表的大小是每個 L0 區域的大小 (L0GPTSZ) 除以顆粒大小 (PGS) 除以每個字節中控制的顆粒 (2)。((L0GPTSZ / PGS) / 2)
-
必須提供足夠的 L1 內存來構建所有請求的 L1 表。
-
L1 內存必須屬于 GPT_GPI_ROOT 類型的 PAS。
如果提供了無效的參數組合,API 將打印錯誤消息并返回負值。應檢查 API 的返回值以確保配置成功。
20.2.2. L0 內存大小和對齊的示例計算
讓 PPS=GPCCR_PPS_4GB 和 L0GPTSZ=GPCCR_L0GPTSZ_30BITS
我們可以用 ((PPS / L0GPTSZ) * 8) 找到總 L0 表大小
替換值得到這個:((0x100000000 / 0x40000000) * 8)
并求解得到 32 個字節。在這種情況下,4096 大于 32,因此 L0 表必須對齊到 4096 字節。
20.2.3. L1 表大小和對齊的示例計算
設 PGS=GPCCR_PGS_4K 和 L0GPTSZ=GPCCR_L0GPTSZ_30BITS
我們可以用 ((L0GPTSZ / PGS) / 2) 找到每個 L1 表的大小。
替代值:((0x40000000 / 0x1000) / 2)
并解決每個 L1 表獲得 0x20000 字節。
總結
以上是生活随笔為你收集整理的20-Granule Protection Tables Library的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 19-Realm Management
- 下一篇: 1-Alternative Boot F