5

x86-64 SMP で動作するバージョン 2.6.32 用の小さな Linux ロード可能カーネル モジュールを作成しています。

私の質問は次のとおりです。カーネルで宣言された CPU ごとの変数のアドレスのオフセットを取得する方法はありますか。オフセットとは、gs レジスタにある percpu ベースからのアドレスのオフセットを意味します。具体的には、現在のタスクのタスク構造体へのポインターである current_task 変数のオフセットを見つけようとしています。

get_current() 関数を持つ arch/x86/include/asm/current.h を見ています。この関数は、マクロ percpu_read_stable を使用して、CPU ごとの変数 current_task を読み取ります。私が理解できる限り、percpu_read_stable は基本的に次のような asm ルーチンに展開されます。

asm("movq %%gs:%P1, %0"
  : "=r" (ret__)
  : "m" (per_cpu__current_task))

これは arch/x86/include/asm/percpu.h にあります。モジュールから gs の後のオフセットを読み取りたいです。per_cpu_current_task 変数を使用して簡単に printk を実行しようとすると、モジュールが強制終了されます。

ご清聴ありがとうございました!

4

1 に答える 1

2

わかりました、この特定のシンボルのオフセットを計算しました。これはカーネルによってエクスポートされます。したがって、/proc/kallsyms にエントリがあります。

000000000000cbc0 D per_cpu__current_task

したがって、この特定の変数のオフセットは 0xcbc0 です。もちろん、オフセットは他のバージョンでは異なります。

于 2012-10-25T18:40:41.623 に答える