6

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

"The role of register r9 is platform specific."

"A virtual platform [...] may designate r9 as an additional callee-saved
 variable register, v6."

问题是:Linux 内核是否将 r9 用于某些特殊目的?还是用作普通的非易失性寄存器?

4

2 回答 2

1

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

${CROSS_COMPILE}objdump -d vmlinux.o | grep 'sb|r9'

检查(同时使用r9sb名称,因为它取决于您的 objdump 究竟是什么输出)。

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

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

于 2011-10-26T08:34:49.650 回答
0

我认为寄存器定义存储在 include/asm-arm/ptrace.h

虽然不确定100%...

于 2011-10-24T19:13:05.823 回答