当我查看u-boot源代码时,我发现它通过r9寄存器传递全局数据
register volatile gd_t *gd asm ("r9")
所以,我很好奇,u-boot如何确保进一步的代码不会使用r9寄存器并破坏全局数据。有没有选项告诉编译器不要使用特定的寄存器?
答案 0 :(得分:2)
来自Procedure Call Standard for the ARM Architecture:
寄存器r9的作用是特定于平台的。虚拟平台可以将任何角色分配给该寄存器,并且必须记录此用法。例如,它可以将其指定为与位置无关的数据模型中的静态基础(SB),或者可以在具有线程本地存储的环境中将其指定为线程寄存器(TR)。该寄存器的使用可能要求所持有的值在所有调用中都是持久的。不需要这种特殊寄存器的虚拟平台可以将r9指定为附加的被调用者保存的变量寄存器v6。
但GCC doesn't have a abi profile for reserving r9
用于平台使用thus the way u-boot does this is with -ffixed-r9 option。
答案 1 :(得分:1)
嗯,有-ffixed-reg。但是,如果使用声明为global的变量编译所有代码,那么它将永远不会用于任何其他目的(请参阅https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars)。