寄存器指南

RISC-V tp / x4 寄存器:线程指针与不可分配 ABI 约定

tp 是 psABI 中的 thread pointer,并被标记为不可分配寄存器。普通过程不应修改 tp;标准 ABI 这样规定,是因为信号处理器等运行环境可能依赖它的值。

psABI:x4 的 ABI 名称是 tp,含义是 Thread pointer。
psABI:tp 是不可分配寄存器,不应被普通过程改写。
新手规则:不要把 tp 当 t0/t1 那样的临时寄存器。
物理编号 x4ABI 名 tp保存责任 N/A
角色
线程指针,用于访问线程局部存储(TLS);普通函数不应改写。
调用约定
不可由普通过程分配
先记一句
psABI 将 tp 标记为不可分配寄存器。
psABI 规范依据

不可分配寄存器

tp 在 psABI 中标记为不可分配寄存器。普通过程不应修改它,因为信号处理器、运行时或平台约定可能依赖该值。

调用后保持:不适用
RISC-V psABI integer register convention
快速理解与检索要点

tp / x4 是 psABI 标记的不可分配寄存器。普通过程不应修改它;它不是普通 caller-saved 或 callee-saved 寄存器选择。

psABI 将 x4/tp 标记为不可分配。
普通过程不应修改 gp/tp,因为信号处理器等运行环境可能依赖其值。

适合什么时候用

  • - 按 psABI 把它识别为 thread pointer,而不是普通临时寄存器。
  • - 阅读反汇编时,看到 tp 要先按线程相关的 ABI 保留值理解。
  • - 需要了解具体 TLS 模型时,查目标平台和工具链 ABI 文档。

什么时候不要这样用

  • - 不要在普通过程里修改 tp。
  • - 不要把 tp 当通用寄存器或临时寄存器使用。

调用前后会发生什么

1

psABI 将 tp 标记为不可分配寄存器。

2

psABI 明确普通过程不应修改 tp,因为信号处理器可能依赖它。

3

它不是 caller-saved 或 callee-saved 的普通选择题,而是不要分配给普通代码使用。

阅读 tp 时先按保留值理解

示例用于理解规则,不替代完整程序
# 不要在普通函数中借用 tp
# 具体线程模型和 TLS 访问形式取决于目标 ABI/工具链
# 临时计算请使用 t0-t6 或按调用约定保存其他寄存器

常见问题

tp / x4 可以当普通临时寄存器吗?

不应该。psABI 将它标记为不可分配,普通过程不应修改。

tp 的保存责任是 caller 还是 callee?

都不是普通意义上的 caller/callee 选择;它是不可分配寄存器,普通代码不应借用。