繁体   English   中英

为什么u-boot可以将全局数据的地址放入r9寄存器?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM