日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

20-Granule Protection Tables Library

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 20-Granule Protection Tables Library 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引流關(guān)鍵詞: 中斷、同步異常、異步異常、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、安全、內(nèi)存管理、頁(yè)表…

快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈


[專欄目錄](méi)-ATF/FF-A/specification學(xué)習(xí)


20.顆粒保護(hù)表庫(kù)

本文檔描述了 Trusted Firmware-A (TF-A) 使用的顆粒保護(hù)表 (GPT) 庫(kù)的設(shè)計(jì)。該庫(kù)提供基于包含系統(tǒng)內(nèi)存布局信息的數(shù)據(jù)結(jié)構(gòu)初始化 GPT、配置系統(tǒng)寄存器以啟用基于這些表的顆粒保護(hù)檢查以及在運(yùn)行時(shí)在不同 PAS(物理地址空間)之間轉(zhuǎn)換顆粒所需的 API .

Arm CCA 添加了兩種新的安全狀態(tài),總共四種:root、realm、secure 和 non-secure。除了新的安全狀態(tài)外,還添加了相應(yīng)的物理地址空間來(lái)控制每個(gè)狀態(tài)的內(nèi)存訪問(wèn)。下表中可以看到允許對(duì)每個(gè)安全狀態(tài)的 PAS 訪問(wèn)。

GPT 可以用作 1 級(jí)或 2 級(jí)查找,具體取決于 PAS 區(qū)域的配置方式。第一步是0級(jí)表,0級(jí)表中的每個(gè)條目控制對(duì)內(nèi)存中相對(duì)較大的區(qū)域(塊描述符)的訪問(wèn),當(dāng)使用單步映射時(shí),整個(gè)區(qū)域可以屬于單個(gè)PAS,或者0 級(jí)條目可以鏈接到 1 級(jí)表,其中相對(duì)較小的內(nèi)存區(qū)域(顆粒)可以通過(guò) 2 步映射分配給不同的 PAS。每個(gè) PAS 使用的映射類型由用戶在設(shè)置配置結(jié)構(gòu)時(shí)確定。

20.1。設(shè)計(jì)概念和界面

本節(jié)介紹 GPT 庫(kù)中使用的一些重要概念和數(shù)據(jù)結(jié)構(gòu)。

決定表的組織方式和功能的三個(gè)主要參數(shù):PPS(受保護(hù)的物理空間)是系統(tǒng)中受保護(hù)的物理地址空間的總量,PGS(物理顆粒大小)是每個(gè)級(jí)別 1 顆粒的大小是,以及 L0GPTSZ(0 級(jí) GPT 大小),它確定每個(gè) 0 級(jí)條目控制多少物理內(nèi)存。顆粒是可以獨(dú)立分配給 PAS 的最小內(nèi)存單元。

L0GTSZ 由硬件決定,從 GPCCR_EL3 寄存器中讀取。PPS 和 PGS 在運(yùn)行時(shí)傳遞到 API 中,可以通過(guò)某種算法或固件中的硬編碼以最適合給定平臺(tái)的任何方式確定。

GPT 設(shè)置分為兩部分:表創(chuàng)建和運(yùn)行時(shí)初始化。在表創(chuàng)建步驟中,包含有關(guān)所需 PAS 區(qū)域信息的數(shù)據(jù)結(jié)構(gòu)被傳遞到庫(kù)中,該庫(kù)驗(yàn)證映射,在內(nèi)存中創(chuàng)建表,并啟用顆粒保護(hù)檢查。在運(yùn)行時(shí)初始化步驟中,運(yùn)行時(shí)固件使用 GPT 寄存器配置定位內(nèi)存中的現(xiàn)有表,并將重要數(shù)據(jù)保存到粒度轉(zhuǎn)換服務(wù)使用的結(jié)構(gòu)中,這將在下面詳細(xì)介紹。

在 FVP 模型的參考實(shí)現(xiàn)中,您可以在文件中找到 PAS 區(qū)域定義的示例include/plat/arm/common/arm_pas_def.h。表創(chuàng)建 API 調(diào)用可以在 中找到plat/arm/common/arm_bl2_setup.c,運(yùn)行時(shí)初始化 API 調(diào)用可以在 中 找到plat/arm/common/arm_bl31_setup.c。

20.1.1。定義 PAS 區(qū)域

結(jié)構(gòu)是一種pas_region_t表示物理地址空間及其屬性的方法,GPT 庫(kù)可以使用它來(lái)初始化表。

該結(jié)構(gòu)由以下部分組成:

  • (1) 基本物理地址

  • (2) 區(qū)域大小

  • (3) 此內(nèi)存區(qū)域的所需屬性(映射類型、PAS 類型)

請(qǐng)參閱 中的pas_region_t類型include/lib/gpt_rme/gpt_rme.h。

程序員應(yīng)該為 API 提供一個(gè)包含結(jié)構(gòu)的數(shù)組pas_region_t ,然后庫(kù)將檢查所需的內(nèi)存訪問(wèn)布局的有效性并創(chuàng)建表來(lái)實(shí)現(xiàn)它。

pas_region_t是一種公共類型,但是建議使用宏 GPT_MAP_REGION_BLOCK和GPT_MAP_REGION_GRANULE來(lái)填充這些結(jié)構(gòu),而不是手動(dòng)填充,以減少將來(lái)出現(xiàn)兼容性問(wèn)題的風(fēng)險(xiǎn)。這些宏將基本物理地址、區(qū)域大小和 PAS 類型作為參數(shù)來(lái)生成 pas_region_t 結(jié)構(gòu)。顧名思義,GPT_MAP_REGION_BLOCK僅使用 L0 映射 GPT_MAP_REGION_GRANULE創(chuàng)建區(qū)域,同時(shí)使用 L0 和 L1 映射創(chuàng)建區(qū)域。

20.1.2. 0 級(jí)和 1 級(jí)表

GPT 初始化 API 需要為要構(gòu)建的表傳入內(nèi)存,gpt_init_l0_tables獲取內(nèi)存地址和大小來(lái)構(gòu)建級(jí)別 0 表,并gpt_init_pas_l1_tables獲取地址和大小來(lái)構(gòu)建從級(jí)別 0 描述符鏈接的級(jí)別 1 表。這些表應(yīng)該具有 PAS 類型GPT_GPI_ROOT,典型的系統(tǒng)可能會(huì)將其 0 級(jí)表放在 SRAM 中,將其 1 級(jí)表放在 DRAM 中。

20.1.3. 顆粒轉(zhuǎn)化服務(wù)

Granule Transition Service 允許使用 SMC 調(diào)用更改使用 GPT_MAP_REGION_GRANULE 所有權(quán)映射的內(nèi)存。非安全顆粒可以轉(zhuǎn)換到領(lǐng)域或安全空間,領(lǐng)域和安全顆粒可以轉(zhuǎn)換回非安全。此庫(kù)僅允許轉(zhuǎn)換為顆粒的內(nèi)存映射,映射為塊的內(nèi)存在表創(chuàng)建后固定其 GPI。

20.2. 庫(kù) API

可以在中找到公共 API 和類型include/lib/gpt_rme/gpt_rme.h,本節(jié)旨在提供更多詳細(xì)信息和說(shuō)明。

要?jiǎng)?chuàng)建 GPT 并啟用粒度保護(hù)檢查,需要在系統(tǒng)啟動(dòng)過(guò)程中以正確的順序和正確的時(shí)間調(diào)用 API。

  • (1) 固件必須啟用 MMU。

  • (2) 固件必須調(diào)用gpt_init_l0_tables以將 0 級(jí)表初始化為默認(rèn)狀態(tài),即初始化所有 L0 描述符以允許對(duì)所有內(nèi)存的所有訪問(wèn)。PPS 作為參數(shù)提供給此函數(shù)。

  • (3) DDR 由系統(tǒng)發(fā)現(xiàn)和初始化,然后將發(fā)現(xiàn)的 DDR 區(qū)域添加到 L1 PAS 區(qū)域以在下一步中初始化并由 GTSI 在運(yùn)行時(shí)使用。

  • (4) 固件必須使用指向包含所需內(nèi)存訪問(wèn)布局的結(jié)構(gòu)gpt_init_pas_l1_tables數(shù)組的指針進(jìn)行 調(diào)用。pas_region_tPGS 作為參數(shù)提供給該函數(shù)。

  • (5) 固件必須調(diào)用gpt_enable以通過(guò)設(shè)置正確的寄存器值來(lái)啟用顆粒保護(hù)檢查。

  • (6) 在使用粒度轉(zhuǎn)換服務(wù)的系統(tǒng)中,運(yùn)行時(shí)固件必須調(diào)用gpt_runtime_init以設(shè)置 GTSI 所需的數(shù)據(jù)結(jié)構(gòu),以查找 PAS 類型之間的表和轉(zhuǎn)換粒度。

20.2.1. API 約束

API 允許的 PPS 和 PGS 值是文件中定義的枚舉類型include/lib/gpt_rme/gpt_rme.h。

PPS 的允許值及其相應(yīng)的大小。

  • GPCCR_PPS_4GB(4GB 保護(hù)空間,0x100000000 字節(jié))
  • GPCCR_PPS_64GB(64GB 保護(hù)空間,0x1000000000 字節(jié))
  • GPCCR_PPS_1TB(1TB 保護(hù)空間,0x10000000000 字節(jié))
  • GPCCR_PPS_4TB(4TB 保護(hù)空間,0x40000000000 字節(jié))
  • GPCCR_PPS_16TB(16TB 保護(hù)空間,0x100000000000 字節(jié))
  • GPCCR_PPS_256TB(256TB 保護(hù)空間,0x1000000000000 字節(jié))
  • GPCCR_PPS_4PB(4PB 保護(hù)空間,0x10000000000000 字節(jié))

PGS 的允許值及其相應(yīng)的大小。

  • GPCCR_PGS_4K(4KB 顆粒,0x1000 字節(jié))
  • GPCCR_PGS_16K(16KB 顆粒,0x4000 字節(jié))
  • GPCCR_PGS_64K(64KB 顆粒,0x10000 字節(jié))

L0GPTSZ 的允許值以及相應(yīng)的大小。

  • GPCCR_L0GPTSZ_30BITS(1GB 區(qū)域,0x40000000 字節(jié))
  • GPCCR_L0GPTSZ_34BITS(16GB 區(qū)域,0x400000000 字節(jié))
  • GPCCR_L0GPTSZ_36BITS(64GB 區(qū)域,0x1000000000 字節(jié))
  • GPCCR_L0GPTSZ_39BITS(512GB 區(qū)域,0x8000000000 字節(jié))

請(qǐng)注意,PPS、PGS 和 L0GPTSZ 定義的值是與大小相對(duì)應(yīng)的編碼值,而不是大小本身。為方便起見(jiàn),提供了大小的解碼十六進(jìn)制表示。

L0 表內(nèi)存有一些必須考慮的約束。

  • L0 表必須與表大小或 4096 字節(jié)對(duì)齊,以較大者為準(zhǔn)。L0 表大小是總保護(hù)空間 (PPS) 除以每個(gè) L0 區(qū)域 (L0GPTSZ) 的大小乘以每個(gè) L0 描述符的大小(8 字節(jié))。((PPS / L0GPTSZ) * 8)

  • L0 內(nèi)存大小必須大于或等于表大小。

  • L0 內(nèi)存必須屬于 GPT_GPI_ROOT 類型的 PAS。

L1 內(nèi)存也有一些限制。

  • L1 表必須與其大小對(duì)齊。每個(gè) L1 表的大小是每個(gè) L0 區(qū)域的大小 (L0GPTSZ) 除以顆粒大小 (PGS) 除以每個(gè)字節(jié)中控制的顆粒 (2)。((L0GPTSZ / PGS) / 2)

  • 必須提供足夠的 L1 內(nèi)存來(lái)構(gòu)建所有請(qǐng)求的 L1 表。

  • L1 內(nèi)存必須屬于 GPT_GPI_ROOT 類型的 PAS。

如果提供了無(wú)效的參數(shù)組合,API 將打印錯(cuò)誤消息并返回負(fù)值。應(yīng)檢查 API 的返回值以確保配置成功。

20.2.2. L0 內(nèi)存大小和對(duì)齊的示例計(jì)算

讓 PPS=GPCCR_PPS_4GB 和 L0GPTSZ=GPCCR_L0GPTSZ_30BITS

我們可以用 ((PPS / L0GPTSZ) * 8) 找到總 L0 表大小

替換值得到這個(gè):((0x100000000 / 0x40000000) * 8)

并求解得到 32 個(gè)字節(jié)。在這種情況下,4096 大于 32,因此 L0 表必須對(duì)齊到 4096 字節(jié)。

20.2.3. L1 表大小和對(duì)齊的示例計(jì)算

設(shè) PGS=GPCCR_PGS_4K 和 L0GPTSZ=GPCCR_L0GPTSZ_30BITS

我們可以用 ((L0GPTSZ / PGS) / 2) 找到每個(gè) L1 表的大小。

替代值:((0x40000000 / 0x1000) / 2)

并解決每個(gè) L1 表獲得 0x20000 字節(jié)。

總結(jié)

以上是生活随笔為你收集整理的20-Granule Protection Tables Library的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。