为什么u-boot的可以把全局数据的地址到R9寄存器?(Why u-boot can put glo

2019-10-21 06:55发布

当我通过u-boot的源代码看,我发现,它通过R9寄存器像这样通过全局数据

register volatile gd_t *gd asm ("r9")

所以,我很好奇,怎么做的u-boot进一步确保代码不会使用R9寄存器和腐败的全局数据。 是否有一个选项来告诉编译器不使用特定的寄存器?

Answer 1:

从过程调用标准ARM体系结构 :

寄存器R9的作用是平台特定的。 虚拟平台可以指定任何角色到该寄存器且必须证明这种用法。 例如,它可以以与位置无关的数据模型将它指定为静态底座(SB),或者它可以将其指定为与线程本地存储的环境线程寄存器(TR)。 该寄存器的使用可能需要保持的数值是在所有通话持续。 具有不需要这样一个特殊的寄存器可指定R9作为附加调用方保存变量寄存器,V6虚拟平台。

然而, GCC没有预留,通过ABI轮廓r9为平台,使用这样的u-boot做到这一点的方法是用-ffixed-R9选项 。



Answer 2:

那么,有-ffixed-REG。 但是,如果所有的代码与这个变量声明为全局编译,那么它将永远不会被用于任何其他目的(见https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global- REG-瓦尔 )。



文章来源: Why u-boot can put global data's address into r9 register?