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 を実行しようとすると、モジュールが強制終了されます。
ご清聴ありがとうございました!