“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 用于某些特殊目的?还是用作普通的非易失性寄存器?
“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 用于某些特殊目的?还是用作普通的非易失性寄存器?
找出内核如何使用它的一种简单方法是简单地构建一个内核(CROSS_COMPILE=... ARCH=arm make vmlinux
),然后反汇编整个东西,
${CROSS_COMPILE}objdump -d vmlinux.o | grep 'sb|r9'
检查(同时使用r9
和sb
名称,因为它取决于您的 objdump 究竟是什么输出)。
如果您发现它在序言/尾声代码中使用(在指令中push {..., r9, ...}
,stmfd sp!, {..., r9, ...}
或它们相应的pop
/ ldmfd
),那么它是被调用者保存的。否则,只是另一个临时注册。结果可能取决于您的工具链、内核配置选项或 ARM 目标。
也就是说,如果您编译 Thumb-2 内核,它不会被调用者保存。这是因为 Thumb-2 push
/pop
仅在较低的 reg 集上运行(和lr
/pc
以互补的方式,push lr
与 配对pop pc
)。
我认为寄存器定义存储在 include/asm-arm/ptrace.h
虽然不确定100%...