当我查看u-boot源代码时,我发现它像这样通过r9寄存器传递全局数据
register volatile gd_t *gd asm ("r9")
所以,我很好奇,u-boot 如何确保进一步的代码不会使用 r9 寄存器并损坏全局数据。是否有选项可以告诉编译器不使用特定的寄存器?
来自 ARM 体系结构的过程调用标准:
寄存器 r9 的作用是特定于平台的。虚拟平台可以将任何角色分配给此寄存器,并且必须记录此使用情况。例如,它可以将其指定为与位置无关的数据模型中的静态基 (SB),或者可以将其指定为具有线程本地存储的环境中的线程寄存器 (TR)。使用此寄存器可能要求所保存的值在所有调用中保持不变。不需要这种特殊寄存器的虚拟平台可以将 r9 指定为附加的被调用方保存的变量寄存器 v6。
然而,GCC 没有用于为平台使用保留r9
的 abi 配置文件,因此 u-boot 这样做的方式是使用 -ffixed-r9 选项。
嗯,有-ffixed-reg。 但是,如果所有代码都使用此声明为全局变量进行编译,则它永远不会用于任何其他目的(请参阅 https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars)。