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'

チェックする(正確に何が出力されるかはobjdumpに依存するため、r9と名前の両方を使用します)。sb

プロローグ/エピローグコード(、、またはそれに対応する/などの命令)で使用されていることがわかった場合はpush {..., r9, ...}stmfd sp!, {..., r9, ...}呼び出しpopldmfdが保存されます。それ以外の場合は、別のスクラッチ登録です。結果は、ツールチェーン、カーネル構成オプション、またはARMターゲットによって異なる場合があります。

とは言うものの、Thumb-2カーネルをコンパイルした場合、それは呼び出し先に保存されません。これは、Thumb-2 push/popが下位のregセットでのみ動作するためです(およびlr/と組み合わせてpc補完的に動作します)。push lrpop pc

于 2011-10-26T08:34:49.650 に答える
0

レジスタ定義は include/asm-arm/ptrace.h に格納されていると思います

100%確実ではありませんが…

于 2011-10-24T19:13:05.823 に答える