ARM在Linux内核中注册r9

Mir*_*cea 6 arm abi cpu-registers linux-kernel

"ARM体系结构过程调用标准"(AAPCS/EABI)声明(5.1.1)

"The role of register r9 is platform specific."
Run Code Online (Sandbox Code Playgroud)

"A virtual platform [...] may designate r9 as an additional callee-saved
 variable register, v6."
Run Code Online (Sandbox Code Playgroud)

问题是:Linux内核是否将r9用于特殊用途?或者它是否用作普通的非易失性寄存器?

Fra*_*kH. 1

了解内核如何使用它的一个简单方法是简单地构建一个内核(CROSS_COMPILE=... ARCH=arm make vmlinux),然后反汇编整个内核,

${CROSS_COMPILE}objdump -d vmlinux.o | grep 'sb|r9'
Run Code Online (Sandbox Code Playgroud)

检查(使用r9sb名称,因为这取决于您的 objdump 到底输出了什么)。

如果您发现它在序言/尾声代码中使用(在诸如push {..., r9, ...}stmfd sp!, {..., r9, ...}或其相应的pop/之类的指令中ldmfd),那么它是被调用者保存的。否则,只是另一个暂存寄存器。结果可能取决于您的工具链、内核配置选项或 ARM 目标。

也就是说,如果您编译 Thumb-2 内核,它将不会被调用者保存。这是因为 Thumb-2 push/pop仅在较低的寄存器集上运行(并且lr/pc以互补的方式push lr与 配对pop pc)。