我目前正在了解
Linux内核启动所需的内容.我正在浏览Linux内核源代码树,特别是ARM体系结构,直到我在
arch/arm/kernel/hyp-stub.S中偶然发现了这个汇编指令retne lr
从概念上讲,很容易理解,如果Z标志为0,则指令返回存储在链接寄存器中的地址.我要查找的是实际记录此ARM汇编指令的位置.
我在ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition A8.8部分搜索,找不到指令的描述.
获取源代码并查看它是否为ARM specific GNU AS extension并未特别显示任何内容.
谷歌搜索与查询“手臂组装ret指令”,“手臂返回指令”和类似的任何东西也没有出现任何有用的东西.当然,我必须在错误的地方寻找,否则我一定会错过一些东西.
任何澄清将不胜感激.
解决方法
架构汇编语言是一回事,现实世界代码是另一回事.一旦汇编程序伪操作和宏发挥作用,熟悉工具链和相关代码库会有很大帮助. 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
为了microarchitectures with a return stack的利益,这是为了emit the architecturally-preferred return instruction,同时允许相同的代码仍然为旧架构编译.