應用程式資料完整性 (ADI)¶
SPARC M7 處理器增加了應用程式資料完整性 (ADI) 功能。ADI 允許任務在其地址空間的任何子集上設定版本標籤。一旦啟用了 ADI 併為任務的地址空間範圍設定了版本標籤,處理器會將這些範圍內指向記憶體的指標中的標籤與應用程式先前設定的版本進行比較。只有當給定指標中的標籤與應用程式設定的標籤匹配時,才允許訪問記憶體。如果發生不匹配,處理器會引發異常。
任務必須採取以下步驟才能完全啟用 ADI
設定使用者模式 PSTATE.mcde 位。這充當任務整個地址空間的主開關,以啟用/停用任務的 ADI。
在任何與啟用 ADI 的地址範圍對應的 TLB 條目上設定 TTE.mcd 位。MMU 僅在設定了 TTE.mcd 位的頁面上檢查版本標籤。
使用 stxa 指令和 MCD 特定 ASI 之一設定虛擬地址的版本標籤。每個 stxa 指令為 ADI 塊大小的位元組數設定給定的標籤。必須為整個頁面重複此步驟,以設定整個頁面的標籤。
平臺的 ADI 塊大小由虛擬機器監控程式在機器描述表中提供給核心。虛擬機器監控程式還提供虛擬地址中指定版本標籤的頂部位數。一旦為某個記憶體位置設定了版本標籤,該標籤將儲存在物理記憶體中,並且相同的標籤必須存在於呈現給 MMU 的虛擬地址的 ADI 版本標籤位中。例如,在 SPARC M7 處理器上,MMU 使用位 63-60 作為版本標籤,ADI 塊大小與快取記憶體行大小相同,即 64 位元組。如果一個任務在一系列記憶體上將 ADI 版本設定為 10,則必須使用位 63-60 中包含 0xa 的虛擬地址訪問該記憶體。
透過使用帶有 PROT_ADI 標誌的 mprotect() 在一組頁面上啟用 ADI。當任務首次在一組頁面上啟用 ADI 時,核心會為該任務設定 PSTATE.mcde 位。記憶體地址的版本標籤使用 ASI_MCD_PRIMARY 或 ASI_MCD_ST_BLKINIT_PRIMARY 透過地址上的 stxa 指令設定。ADI 塊大小由虛擬機器監控程式提供給核心。核心使用輔助向量以及其他 ADI 資訊將 ADI 塊大小的值返回給使用者空間。核心提供以下輔助向量
AT_ADI_BLKSZ
ADI 塊大小。這是 ADI 版本控制的粒度和對齊方式(以位元組為單位)。
AT_ADI_NBITS
VA 中 ADI 版本位的數量
重要提示¶
版本標籤值 0x0 和 0xf 是保留的。這些值與虛擬地址中的任何標籤匹配,並且永遠不會生成不匹配異常。
即使標籤儲存在物理記憶體中,版本標籤也是從使用者空間在虛擬地址上設定的。在將物理頁面分配給任務併為其建立 pte 之後,會在物理頁面上設定標籤。
當任務釋放它設定了版本標籤的記憶體頁面時,該頁面將返回到可用頁面池。當該頁面重新分配給任務時,核心會使用塊初始化 ASI 清除該頁面,該 ASI 也會清除該頁面的版本標籤。如果分配給任務的頁面被釋放並重新分配回同一任務,則該任務在該頁面上設定的舊版本標籤將不再存在。
對於非錯誤載入,不會檢測到 ADI 標籤不匹配。
核心不會為使用者頁面設定任何標籤,設定任何版本標籤完全是任務的責任。核心確實確保如果頁面被交換到磁碟並交換回,版本標籤將保留。如果頁面被遷移,它也會保留版本標籤。
ADI 適用於任何大小的頁面。使用者空間任務在使用 ADI 時無需瞭解頁面大小。它可以簡單地選擇一個虛擬地址範圍,使用 mprotect() 在該範圍上啟用 ADI,併為整個範圍設定版本標籤。mprotect() 確保範圍與頁面大小對齊並且是頁面大小的倍數。
ADI 標籤只能在可寫記憶體上設定。例如,ADI 標籤不能在只讀對映上設定。