我正在尝试了解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 build gdata加载到r9寄存器 - “ldr r9,= gdata”)。 r9寄存器是否有特定用途,因此我们将sp值存储到r9。
答案 0 :(得分:3)
ARM在Procedure Call Standard中提出的一般ABI将r9指定为"平台注册":
虚拟平台可以将任何角色分配给此注册表,并且必须记录此用法。例如,它可以将其指定为与位置无关的数据模型中的静态基础(SB),或者可以在具有线程本地存储的环境中将其指定为线程寄存器(TR)。该寄存器的使用可能要求所持有的值在所有调用中都是持久的。不需要这种特殊寄存器的虚拟平台可以将r9指定为附加的被调用者保存的变量寄存器v6。
在这种情况下,U-Boot ABI似乎将其用于全局数据指针(另请参阅 arch / arm / lib / crt0.S 和 arch / arm / include / asm / global_data.h ),但可能是"必须记录此用法"点...