AArch64 Linux 中的標記虛擬地址

作者:Will Deacon <will.deacon@arm.com>

日期:2013 年 6 月 12 日

本文件簡要描述了 AArch64 轉換系統中的標記虛擬地址的規定及其在 AArch64 Linux 中的潛在用途。

核心配置轉換表,以便透過 TTBR0(即使用者空間對映)進行的轉換忽略虛擬地址的最高位元組(位 63:56)。 這為應用程式使用釋放了該位元組。

將標記地址傳遞給核心

核心對使用者空間記憶體地址的所有解釋都假定地址標記為 0x00,除非應用程式顯式啟用 AArch64 標記地址 ABI(AArch64 標記地址 ABI)。

這包括但不限於以下位置找到的地址

  • 系統呼叫的指標引數,包括傳遞給系統呼叫的結構中的指標,

  • 堆疊指標 (sp),例如,在解釋它以傳遞訊號時,

  • 幀指標 (x29) 和幀記錄,例如,在解釋它們以生成回溯或呼叫圖時。

當用戶空間應用程式未啟用 AArch64 標記地址 ABI 時,在任何這些位置使用非零地址標記可能會導致返回錯誤程式碼,引發(致命)訊號或其他故障模式。

由於這些原因,當停用 AArch64 標記地址 ABI 時,禁止透過系統呼叫將非零地址標記傳遞給核心,並且強烈建議不要對 sp 使用非零地址標記。

維護使用非零地址標記的幀指標和幀記錄的程式可能會受到除錯和分析可見性受損或不準確的影響。

保留標記

傳遞訊號時,除非在安裝訊號處理程式時在 sigaction.sa_flags 中設定了標誌 SA_EXPOSE_TAGBITS,否則非零標記不會保留在 siginfo.si_addr 中。 這意味著在使用標記的應用程式中的訊號處理程式不能依賴於在這些欄位中維護的使用者虛擬地址的標記資訊,除非設定了該標誌。

由於架構限制,即使設定了 SA_EXPOSE_TAGBITS,也無法響應同步標記檢查錯誤 (SEGV_MTESERR) 保留錯誤地址的位 63:60。 應用程式應將這些位的值視為未定義,以便適應將來可能保留這些位的架構修訂。

對於響應監視點除錯異常引發的訊號,無論 SA_EXPOSE_TAGBITS 標誌設定如何,都將保留標記資訊。

無論 SA_EXPOSE_TAGBITS 標誌設定如何,非零標記永遠不會保留在 sigcontext.fault_address 中。

該架構阻止使用標記的 PC,因此在異常返回時,最高位元組將被設定為位 55 的符號擴充套件。

當啟用 AArch64 標記地址 ABI 時,將保持此行為。

其他注意事項

使用標記指標時應特別小心,因為 C 編譯器很可能不會對僅在最高位元組中不同的兩個虛擬地址進行雜湊處理。