2015-09-09 214 views
0

我想了解U-boot源(2014.07)。我可以在arch/arm/cpu/armv7/lowlevel_init.S文件中看到以下代碼。在ARM中使用r9寄存器

#ifdef CONFIG_SPL_BUILD 
     ldr  r9, =gdata 
#else 
     sub  sp, sp, #GD_SIZE 
     bic  sp, sp, #7 
     mov  r9, sp 
#endif 
     push {ip, lr} 
     bl  s_init 
     pop  {ip, pc} 

你能告訴爲什麼SP移動到R9寄存器 - 「MOV R9,SP」(對於SPL構建GDATA加載到R9登記冊 「LDR R9,= GDATA」)。 是否有任何具體的使用r9寄存器,以便我們將sp值存儲到r9。

+0

雖然它通常不會被用作參數,也許它是。 s_init裏面有什麼?由於這是一個開源項目,你是否也可以鏈接到源代碼? – domen

+0

s_init函數設置pll,mux配置等.s_init的定義爲@ http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7 /omap-common/hwinit-common.c;h=5f50a1980157d646b1308bf8d98b529009d40d1e;hb=524123a70761110c5cf3ccc5f52f6d4da071b959 – user3693586

回答

2

一般ABI在Procedure Call Standard列明由ARM指定R9爲「平臺註冊」:

虛擬平臺可以指定任何角色到該寄存器且必須證明這種用法。例如,它可以將其指定爲位置無關的數據模型中的靜態基址(SB),或者可以在具有線程本地存儲的環境中將其指定爲線程寄存器(TR)。這個寄存器的用法可能要求所有呼叫持有的值是永久的。不需要這種特殊寄存器的虛擬平臺可以將r9指定爲額外的被呼叫保存的變量寄存器v6。

在這種情況下,U-Boot的ABI似乎使用它用於全局數據指針(也參見拱/臂/ LIB/crt0.s中拱/臂/包括/ ASM/global_data。 h),但也許在「必須記錄這個用法」一點上不足......

+0

謝謝,所以在「arch/arm/cpu/armv7/lowlevel_init.S」中,他們使用r9作爲全局數據指針。但我不認爲他們已經在s_init中使用了這個全局數據指針(defined @ http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7 /omap-common/hwinit-common.c;h=5f50a1980157d646b1308bf8d98b529009d40d1e;hb=524123a70761110c5cf3ccc5f52f6d4da071b959)。再次在crt0.S中它們也是這樣做的(初始化sp,將sp移動到GD_SIZE,將全局數據指針存儲在r9中)。 – user3693586

+0

根據當前代碼中的評論,它看起來是爲了希望它的舊的特定於底層的初始化代碼(大概在_main之前被調用) – Notlikethat

+0

這是正確的。值得注意的是,u-boot可能會在配置存儲設備時偶爾改變'r9'寄存器。所以全球數據可能是移動的。那是**爲什麼**他們使用'r9'。使用隨着時間/平臺而變化,所以人們應該謹慎。 SPL是一個'裝載機 - 裝載機'; SOC ROM代碼通常將堆棧設置爲有限的R/W內存,因此SPL在SPL裝載器加載器的同一位置使用堆棧/數據。 –