2014-12-29 196 views
8

我目前正在理解Linux內核啓動需要什麼。我正在瀏覽Linux內核源代碼樹,特別是ARM架構,直到我偶然發現了這個彙編指令retne lrarch/arm/kernel/hyp-stub.SARM彙編「retne」指令

從概念上講,很容易理解指令假設返回到存儲在鏈接中的地址如果Z標誌爲0,則進行註冊。我正在尋找的是實際記錄此ARM彙編指令的地方。

我在ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition的第A8.8節中搜索到,找不到說明的說明。

對源代碼進行清理並查看它是否爲ARM specific GNU AS extension並沒有特別說明什麼。

谷歌搜索與查詢「臂大會ret指令」,「手臂返回指令」和任何類似的沿線沒有任何有用的。當然,我必須在錯誤的地方尋找,否則我一定會錯過一些東西。

任何澄清將不勝感激。

回答

11

建築彙編語言是一回事,現實世界的代碼是另一回事。一旦彙編僞指令和宏發揮作用,對工具鏈和代碼庫的熟悉程度就會有所幫助。儘可能多的彙編源代碼包含彙編宏和CPP宏的多個層,但Linux尤其令人討厭。如果你知道要尋找什麼,並按照頭小道arch/arm/include/asm/assembler.h,你最終會發現這個複雜的野獸:

.irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo 
.macro ret\c, reg 
#if __LINUX_ARM_ARCH__ < 6 
     mov\c pc, \reg 
#else 
     .ifeqs "\reg", "lr" 
     bx\c \reg 
     .else 
     mov\c pc, \reg 
     .endif 
#endif 
     .endm 
     .endr 

這樣做的目的是爲了emit the architecturally-preferred return instructionmicroarchitectures with a return stack利益,同時允許相同的代碼仍然編譯爲更舊的體系結構。

+3

另請參閱相關的[提交消息](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/kernel/hyp-stub.S? ID = 6ebbf2ce437b33022d30badd49dc94d33ecfa498)。 – Jester

+0

我只是在尋找,謝謝;) – Notlikethat

+0

難怪爲什麼掠奪來源,看看它是否是一個ARM特定的GNU AS擴展也沒有任何東西。謝謝,這完美地闡明瞭它。 – jrcatbagan