【问题标题】:ARM assembly "retne" instructionARM 汇编“retne”指令
【发布时间】:2015-02-25 22:35:01
【问题描述】:

我目前正在了解启动 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 并没有特别发现任何东西。

使用“arm assembly ret 指令”、“arm 返回指令”和类似的查询进行谷歌搜索也没有发现任何有用的信息。当然,我一定是找错地方了,或者我一定错过了什么。

任何澄清将不胜感激。

【问题讨论】:

    标签: linux assembly linux-kernel arm


    【解决方案1】:

    架构汇编语言是一回事,现实世界的代码是另一回事。一旦汇编器伪操作和宏开始发挥作用,熟悉相关工具链和代码库就会有很大帮助。 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,同时允许相同的代码仍然为旧架构编译。

    【讨论】:

    • 另见相关commit message。
    • 难怪搜索源代码并查看它是否是 ARM 特定的 GNU AS 扩展也没有发现任何问题。谢谢,这完美地澄清了它。
    猜你喜欢
    • 2022-08-11
    • 2011-02-18
    • 2023-03-10
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多