“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用于特殊用途?或者它是否用作普通的非易失性寄存器?
答案 0 :(得分:1)
找出内核如何使用它的一种简单方法是简单地构建一个内核(CROSS_COMPILE=... ARCH=arm make vmlinux
),然后反汇编整个内容,
${CROSS_COMPILE}objdump -d vmlinux.o | grep 'sb|r9'
检查(使用r9
和sb
两个名称,因为它取决于你的objdump究竟是什么输出)。
如果您发现它在prologue / epilogue代码中使用(在push {..., r9, ...}
,stmfd sp!, {..., r9, ...}
或其对应的pop
/ ldmfd
等说明中),那么它就会被保存。否则,只是另一个划痕。结果可能取决于您的工具链,内核配置选项或ARM目标。
也就是说,如果编译Thumb-2内核,它将不被callee保存。这是因为Thumb-2 push
/ pop
仅以较低的注册集(和lr
/ pc
以互补方式运作,push lr
与{{pop pc
配对1}})。
答案 1 :(得分:0)
我认为寄存器定义存储在include / asm-arm / ptrace.h
中虽然不确定100%......