【问题标题】:Usage of r9 register in ARMARM中r9寄存器的使用
【发布时间】:2015-09-09 19:37:01
【问题描述】:

我正在尝试了解 U-boot 源 (2014.07)。我可以在 arch/arm/cpu/armv7/lowlevel_init.S 文件中看到以下代码。

#ifdef CONFIG_SPL_BUILD
        ldr     r9, =gdata
#else
        sub     sp, sp, #GD_SIZE
        bic     sp, sp, #7
        mov     r9, sp
#endif
        push    {ip, lr}
        bl      s_init
        pop     {ip, pc}

你能告诉我为什么 sp 被移动到 r9 寄存器 - “mov r9, sp”(对于 SPL 构建 gdata 被加载到 r9 寄存器 - “ldr r9, =gdata”)。 r9寄存器有什么具体用途吗,所以我们将sp值存储到r9。

【问题讨论】:

标签: arm u-boot


【解决方案1】:

ARM 在Procedure Call Standard 中列出的通用 ABI 将 r9 指定为“平台寄存器”:

虚拟平台可以为该寄存器分配任何角色,并且必须记录此用法。例如,它可以在与位置无关的数据模型中将其指定为静态基址(SB),或者在具有线程本地存储的环境中将其指定为线程寄存器(TR)。该寄存器的使用可能要求所保存的值在所有调用中都是持久的。不需要这种特殊寄存器的虚拟平台可以将 r9 指定为附加的被调用者保存的变量寄存器 v6。

在这种情况下,U-Boot ABI 似乎将它用于全局数据指针(另见 arch/arm/lib/crt0.Sarch/arm/include/ asm/global_data.h),但可能没有达到“必须记录此用法”这一点...

【讨论】:

  • 谢谢,所以在 "arch/arm/cpu/armv7/lowlevel_init.S" 他们使用 r9 作为全局数据指针。但我认为他们没有在 s_init 中使用过这个全局数据指针(定义为@git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/…)。再次在 crt0.S 中他们也在做同样的事情(初始化 sp,将 sp 移动到 GD_SIZE,将全局数据指针存储在 r9 中)。
  • 根据当前代码中的注释,它看起来是为了需要它的旧板特定低级初始化代码(大概在_main之前调用)
  • 这是正确的。还值得注意的是,u-boot 有时会在配置存储设备时更改“r9”寄存器。所以全球数据可能是移动的。这就是为什么他们使用'r9'。使用随时间/平台而变化,因此人们应该谨慎。 SPL 是一个“加载器-加载器”; SOC rom 代码通常将堆栈设置为有限的 R/W 内存,因此 SPL 将堆栈/数据在同一位置用于 SPL loader-loader。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2014-01-06
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多