當我通過u-boot的源代碼看,我發現,它通過R9寄存器傳遞全局數據這樣爲什麼u-boot可以將全局數據的地址放入r9寄存器中?
register volatile gd_t *gd asm ("r9")
所以,我很好奇,請問u-boot的進一步確保代碼不會用r9寄存器並破壞全局數據。有沒有告訴編譯器不要使用特定寄存器的選項?
當我通過u-boot的源代碼看,我發現,它通過R9寄存器傳遞全局數據這樣爲什麼u-boot可以將全局數據的地址放入r9寄存器中?
register volatile gd_t *gd asm ("r9")
所以,我很好奇,請問u-boot的進一步確保代碼不會用r9寄存器並破壞全局數據。有沒有告訴編譯器不要使用特定寄存器的選項?
從Procedure Call Standard for the ARM Architecture:
寄存器R9的作用是特定的平臺。虛擬平臺可以將任何角色分配給該註冊,並且必須記錄這種使用。例如,它可以將其指定爲位置無關的數據模型中的靜態基址(SB),或者可以在具有線程本地存儲的環境中將其指定爲線程寄存器(TR)。這個寄存器的用法可能要求所有呼叫持有的值是永久的。不需要這種特殊寄存器的虛擬平臺可以將r9指定爲額外的被呼叫保存的變量寄存器v6。
然而GCC doesn't have a abi profile for reserving r9
用於平臺使用thus the way u-boot does this is with -ffixed-r9 option。
那麼,有-ffixed-reg。但是,如果所有代碼都是在聲明爲全局變量的情況下編譯的,那麼它將永遠不會用於任何其他目的(請參閱https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars)。
值得注意的是,它曾經是r8,仍然在一些供應商分支:http://git.denx.de/?p=u-boot.git;a=commitdiff;h=fe1378a961e508b31b1f29a2bb08ba1dac063155 – unixsmurf