AArch64 Linux 中的标记虚拟地址

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

日期 : 2013年6月12日

本文档简要介绍了 AArch64 转换系统中对标记虚拟地址的支持,以及它们在 AArch64 Linux 中的潜在用途。

内核配置转换表,使得通过 TTBR0 进行的转换(即用户空间映射)中虚拟地址的顶层字节(第 63:56 位)被转换硬件忽略。这释放了该字节供应用程序使用。

将标记地址传递给内核

除非应用程序显式启用了 AArch64 标记地址 ABI(AArch64 TAGGED ADDRESS ABI),否则内核对用户空间内存地址的所有解释都假定地址标签为 0x00。

这包括但不限于以下位置中的地址:

  • 系统调用的指针参数,包括传递给系统调用的结构体中的指针,

  • 栈指针 (sp),例如在解释它以发送信号时,

  • 帧指针 (x29) 和帧记录,例如在解释它们以生成回溯或调用图时。

当用户空间应用程序未启用 AArch64 标记地址 ABI 时,在上述任何位置使用非零地址标签可能会导致返回错误代码、引发(致命)信号或其他故障模式。

基于这些原因,当 AArch64 标记地址 ABI 被禁用时,禁止通过系统调用将非零地址标签传递给内核,并且强烈不建议对 sp 使用非零地址标签。

维护帧指针和帧记录并使用非零地址标签的程序,其调试和性能分析的可视性可能会受损或变得不准确。

保留标签

在发送信号时,除非在安装信号处理程序时设置了 sigaction.sa_flags 中的 SA_EXPOSE_TAGBITS 标志,否则 siginfo.si_addr 中不会保留非零标签。这意味着,除非设置了该标志,否则使用标签的应用程序中的信号处理程序不能依赖这些字段中维护的用户虚拟地址标签信息。

如果支持 FEAT_MTE_TAGGED_FAR (Armv8.9),则在响应同步标签检查错误 (SEGV_MTESERR) 时会保留错误地址的第 63:60 位,否则即使设置了 SA_EXPOSE_TAGBITS 也不会保留。应用程序应根据对 HWCAP3_MTE_FAR 的支持来解释这些位的值。如果不支持,则应认为这些位的值未定义,否则视为有效。

对于响应观察点调试异常而引发的信号,无论 SA_EXPOSE_TAGBITS 标志的设置如何,标签信息都将被保留。

无论 SA_EXPOSE_TAGBITS 标志的设置如何,sigcontext.fault_address 中都不会保留非零标签。

该架构禁止使用带标记的程序计数器(PC),因此在异常返回时,顶层字节将被设置为第 55 位的符号扩展。

即使启用了 AArch64 标记地址 ABI,这种行为也会保持不变。

其他注意事项

在使用标记指针时应特别小心,因为 C 编译器很可能不会对仅在顶层字节上不同的两个虚拟地址进行区别对待。