[英]Why u-boot can put global data's address into r9 register?
当我查看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。 但是,如果所有代码都是使用声明为global的变量编译的,那么它将永远不会用于任何其他目的(请参阅https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global- Reg-Vars )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.