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 使用非零地址标签。
维护帧指针和帧记录并使用非零地址标签的程序,其调试和性能分析的可视性可能会受损或变得不准确。
其他注意事项¶
在使用标记指针时应特别小心,因为 C 编译器很可能不会对仅在顶层字节上不同的两个虚拟地址进行区别对待。