当我通过u-boot的源代码看,我发现,它通过R9寄存器像这样通过全局数据
register volatile gd_t *gd asm ("r9")
所以,我很好奇,怎么做的u-boot进一步确保代码不会使用R9寄存器和腐败的全局数据。 是否有一个选项来告诉编译器不使用特定的寄存器?
当我通过u-boot的源代码看,我发现,它通过R9寄存器像这样通过全局数据
register volatile gd_t *gd asm ("r9")
所以,我很好奇,怎么做的u-boot进一步确保代码不会使用R9寄存器和腐败的全局数据。 是否有一个选项来告诉编译器不使用特定的寄存器?
从过程调用标准ARM体系结构 :
寄存器R9的作用是平台特定的。 虚拟平台可以指定任何角色到该寄存器且必须证明这种用法。 例如,它可以以与位置无关的数据模型将它指定为静态底座(SB),或者它可以将其指定为与线程本地存储的环境线程寄存器(TR)。 该寄存器的使用可能需要保持的数值是在所有通话持续。 具有不需要这样一个特殊的寄存器可指定R9作为附加调用方保存变量寄存器,V6虚拟平台。
然而, GCC没有预留,通过ABI轮廓r9
为平台,使用这样的u-boot做到这一点的方法是用-ffixed-R9选项 。
那么,有-ffixed-REG。 但是,如果所有的代码与这个变量声明为全局编译,那么它将永远不会被用于任何其他目的(见https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global- REG-瓦尔 )。