i.MX RT1170系列微控制器引入了XRDC2(Extended Resource Domain Controller 2),它為訪問控制、系統內存保護和外圍設備隔離提供了一個集成且可擴展的架構框架。XRDC2允許軟件將 MCU 資源分配給處理 domain ,從而支持安全的運行環境。本文將詳細介紹XRDC2的功能、運作原理和範例應用,幫助讀者更好地理解和使用。

二.主要功能
XRDC2的關鍵功能包括:
- 資源分配:將處理器資源分配給處理 domain ,每個處理 domain 分配一個獨特 domain 標識(DID)。
- DID使用:DID 是一個與各個系統資料傳輸相關的新屬性,並與 user/privileged 、secure/nonsecure 屬性結合使用進行訪問控制。
- 訪問權限:對從屬記憶體和周邊目標的訪問權限由訪問設定的區域或記憶體區塊 (memory slot)描述符決定。
- 共享支持:以動態確定訪問權限方式支持使用獨占訪問鎖共享記憶體區域和周邊。
- 層次訪問模型:基於 4 級層次訪問模型(SecurePrivileged > SecureUser > NonsecurePrivileged > NonsecureUser)構建,並在 XRDC2 中以每個 domain 的 3 bit 訪問控制 Policy(DxACP)。
- 全局和個別描述鎖:全 domain 和個別描述符鎖定配置暫存器。
- 分佈式程式模型:軟體模型和硬體實現分佈在多個子模組中,支援廣泛、高度可配置的架構,可擴展的硬體設計和實現,並可擴展到各種SoC設備。
三.運作模組說明
3.1 記憶體保護機制
XRDC2的記憶體保護機制由兩部分組成:
· MDAC為每個總線事件分配DID(domain identifier)和訪問屬性。
· 訪問控制模組:包括Memory Region Controller(MRC)、Peripheral Access Controller(PAC)和Memory Slot Controller(MSC),根據 DID 和事件屬性強制執行訪問控制策略。


3.2 Master Domain Assignment Controller(MDAC)
MDAC 負責為每個系統總線事件生成 DID、非安全和特權屬性。主要行為如下
1. 匹配輸入:MDAC 根據每個啟用的 MDA 描述符的匹配欄位(MATCH field)和遮罩欄位(MASK field)對每個 Bus 事件進行匹配比較。
2. 生成DID:當 MDAC 的匹配輸入與所有位位置的MATCH欄位匹配時,MDA 生成一個命中。優先級最高的 MDA 命中生效,其 DID、PA(特權屬性)、SA(安全屬性)欄位值決定了總線事件的 DID、非安全和特權屬性。
下表為 RT1170 的 MDAC 配,根據硬體的不同,可匹配 (MATCH) 的數量不同。

3.3 Memory Region Controller(MRC)
MRC 為針對非周邊設備記憶體空間的所有總線參考提供基於 domain 的硬體訪問控制。使用預先編程的記憶體區域描述符(MRGD)定義記憶體空間和其相關的訪問權限。當系統訪問時,MRC 具體動作如下:
1. 區域命中檢測:MRC 通過與描述符中定義的起始和結束地址進行比較來檢測當前的系統引用地址是否命中某個記憶體區域。
2. 優先級評估:如果命中多個區域,MRC選擇優先級最高的描述符進行評估。
3. 權限檢查:根據 DxACP 欄位和訪問屬性(讀/寫、安全/非安全、用戶/特權),評估訪問權限。如果權限足夠,允許訪問,否則產生 Bus Fault。
3.4 Memory Slot Controller(MSC)
MSC為具有固定地址範圍的記憶體空間或周邊設備執行訪問控制。對於該地址範圍內的訪問,MSC使用與訪問相關的DID選擇適當的DxACP欄位,並評估訪問的有效性。如果訪問權限足夠,允許訪問,否則產生 Bus Fault。
3.5 Peripheral Access Controller(PAC)
PAC為連接到周邊設備總線橋或集成到周邊設備子系統中的一組周邊設備執行訪問控制。PAC選擇PDAC描述符,並使用與訪問相關的DID選擇適當的DxACP欄位,然後評估訪問的有效性。如果訪問權限足夠,允許訪問,否則產生 Bus Fault。
3.6 Exclusive Access Lock(EAL)
排他訪問鎖是用來動態修改DxACP評估以便在任何給定時間只有一個 domain 可以訪問的硬體機制。

3.7 DxACP 評估
XRDC2的訪問控制機制基於4級權限(SecurePrivileged (安全特權)/SecureUser(安全使用) /NonsecurePrivileged(非安全特權)/NonsecureUser(非安全使用)),權限根據 domain 設定的 Policy 決定是否有權利執行,權限差異如下表所示。

使用者根據系統架構所需設定各個 domain 的 Policy

在系統訪問權限檢查將 DxACP 欄位值與事件的訪問屬性(讀/寫、安全/非安全、用戶/特權)進行比較。如果權限足夠,允許訪問,否則產生 Bus Fault。
3.8 Manager(MGR)
完整的編程模型非常龐大,需要一個64 Kbyte的從屬周邊暫存器地址空間插槽,儘管大多數設備定義了一個稀疏分佈的子集。
MGR子模組實現全局暫存器。其他暫存器分佈在各個子模組實例(MSC、PAC、MDAC、MRC)中。MGR子模組為所有編程模型訪問提供所需的硬體管理,生成和分配適當的地址解碼和寫數據給MSC、PAC、MDAC和MRC子模組實例,並收集和合併所有暫存器讀數據總線和響應。
3.9 初始化與配置
XRDC2的初始化過程通常包括以下步驟:
1. 透過描述符配置分配所有的 domain (MDACi_MDAj_Wk)、記憶體區域(MRCi_MRGDj_Wk)、周邊 domain 訪問控制(PACi_PDACj_Wk)和 Memory Slot 訪問控制(MSCi_Wk)。
2. 啟用XRDC2 後將會設置 MCR [GVLDM] bit。
3. 根據系統資料匯流排的延遲後設置 MCR[GVLDC] bit,並使 XRDC2 全面運行。
四.範例測試
本次實作希望透過 XRDC2 範例說明透過配置修改 BUS 權限的控制方式
1. 導入 XRDC2 範例,點選 import SDK example ,在 SDK Import wizard 中選擇 RT1170 開發板
2. 輸入 XRDC 選擇 CM7 範例
3. 載入範例後可看到針對 M7 AXI 及 M7 AHB 進行權限配置,在後續配置 memory 及 peripheral 的 Policy時會根據此權限決定是否有訪問權
其中 AXI Bus 負責 SDRAM / NAND/NOR/SRAM/SRAM 等資料傳輸
AHB 透過 AIPS Lite 連接到 peripheral,進而配置 Peripheral 權限
4. 修改 memory 訪問權限,配置為全部 policy 皆可訪問,此處展示可配置多個 policy,根據 domain 不同而有不同的權限,方便起見將所有 domain policy 配置為全部讀寫。

5. 透過 XRDC2_SetGlobalValid 全面啟動並確認目前 XRDC2 配置的 Domain ID 為配置的 ID 2
到此關於配置的部分已經完成
6. 測試記憶體 memory 部分,先將 0x20200000 - 0x2023ffff 配置為皆不可訪問
關閉 cache避免存取到 cache 的數值,如此可以直接訪問 memory 位置,直接讀取 memory 位置
7. 從執行結果可看到,當執行到 TouchMemory 時進入 BusFalut,在此範例 override BusFault_Handler 讓其執行 Fault_Handler,在此為 demo 透過 flag 判斷目前產生 error 的來源再進行處理。
8. 後續 DEMO_Periph,DEMO_MemSlot 皆是相同模式的測試方式
9. 修改 DEMO_AssignDomain 將 privilegeAttr 修改如下
|
assignment.privilegeAttr = kXRDC2_ForceUser; assignment.secureAttr = kXRDC2_ForceSecure; |
10. 將 memory policy 修改為 kXRDC2_AccessPolicyAlt3,DEMO_SetMemoryUnaccessible 修改為如下圖所示
將 DEMO_Mem 中的等待用的 while 移除,此 while 圈僅是在等待 BusFault_Handler 產生,移除後不影響整個 demo
11. 將 peripheral 修改為 kXRDC2_AccessPolicyAlt2,DEMO_SetPeriphUnaccessible 修改如下圖所示
12. 這二種設定剛好可以體現 Policy 配置對訪問權限控制的影響,在執行後可看 memory 因配置 kXRDC2_AccessPolicyAlt3 此時訪問並不會觸發 BusFault_Handler,而 peripheral 因 police 配置,目前訪問的權限不允許而觸發 BusFault_Handler

讀者可自行修改配對,進而更加了解 XRDC2 對於資源管理的功用。