2011-07-19 7 views
2

私はLinux上で実行されているすべてのタスクを解析するプログラムを作成しています。各タスクのinit_taskから読み込みます。読み込まれるtask_struct構造体は、状態、Oncpu ..私はまた、そのタスクの退避したレジスタを見つける必要があるしかしLinuxでプロセスの保存されたレジスタを取得する方法(ARMアーキテクチャ)

は、特に私はと呼ばれる構造体へのポインタを見つけたtask_structでも

R10、IP、SP、FPとPC

レジスタR0〜レジスタR4〜PCを保持するcpu_context

したがって、問題は、レジスタR0〜R3を取得する方法がわからないことです。 私は手動タスクのスタックを解析しようとしましたが、私はすべての関連する値ので、ここで

が私の質問です発見していない:スタック内の

-where(またはメモリ内の他の場所で)が保存されています実行されていないタスクのレジスタ?

- 私は、構造体cpu_contextで見つかったR4からPCまでのレジスタの値を信頼しますか?

私はもちろんのLinuxカーネル2.6.35.7+は、ボード上で実行されているJTAGリンク

でホストPCとリンクARMのCortex A9 MPCoreプロセッサを含むボード(2つのコア)、(これを使用してい

カーネルはARMアーキテクチャのためにコンパイルされました)

ホストPC上で私はデバッグにOPENOCDとGDBを使用しています。

おかげ

答えて

1

cpu_contextは、呼び出し側は、レジスタが保存されていない保存され、__switch_toが呼び出されたレジスタの値が含まれています。

割り込みまたはシステムコールへのエントリ時にレジスタの値を必要とする場合は、別の場所を参照する必要があります。

3

それはあなたが興味を持っているレジスタのどのセットに依存します。

あなたはユーザーモードの状態に興味がある場合は、ptraceはそれをしない方法について見てみましょう。ソースコードの素早い覗き見から、task_pt_regs(task)を見てください。どうやら、彼らはタスクのカーネルスタックの一番上にいます(たとえば、vector_swiを見てください;その先頭にはstmia sp, {r0 - r12}、その後にはsplrというストアがあります)。あなたは、カーネルモードの状態に興味がある場合

は、それが(TI_CPU_SAVEstruct thread_infocpu_contextのオフセットされた)task->cpu_context__switch_toによって保存されます。すでに述べた別の答えとして、r0-r3を保存するわけではありません。 switch_toの発信者は、__switch_toで争うと仮定しているため、その値は関係ありません。

関連する問題