jrc*_*gan 8 linux assembly arm linux-kernel
我目前正在了解Linux内核启动所需的内容.我正在浏览Linux内核源代码树,特别是ARM体系结构,直到我retne lr在arch/arm/kernel/hyp-stub.S中偶然发现了这个汇编指令.
从概念上讲,很容易理解,如果Z标志为0,则指令返回存储在链接寄存器中的地址.我正在寻找的是实际记录此ARM汇编指令的位置.
我搜索了ARM体系结构参考手册ARMv7-A和ARMv7-R版本的 A8.8部分,但找不到该指令的描述.
获取源代码并查看它是否是ARM特定的GNU AS扩展,并没有特别提到任何内容.
谷歌搜索与查询"arm assembly ret instruction","arm return instruction"以及任何类似的东西都没有出现任何有用的东西.当然,我必须在错误的地方寻找,否则我一定会错过一些东西.
任何澄清将不胜感激.
Not*_*hat 11
架构汇编语言是一回事,现实世界代码是另一回事.一旦汇编程序伪操作和宏发挥作用,熟悉工具链和相关代码库会有很大帮助.Linux特别令人讨厌,因为大部分汇编源包含汇编程序宏和CPP宏的多个层.如果你知道要寻找什么,并按照标题追踪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
Run Code Online (Sandbox Code Playgroud)
这样做的目的是为了带有返回堆栈的微体系结构的好处发出体系结构优先的返回指令,同时允许相同的代码仍然为旧架构编译.