Linuxデバイスドライバーを読んでいると、プロセス記述子(タイプstruct task_struct
)に特定のタスクに関するすべての情報があることがわかりました。プロセス記述子は、スラブアロケータによって動的に割り当てられます。
私が知りたいのは、スタックの一番下に格納されるthread_info
と呼ばれる新しい構造を導入する必要性についてです(x86を想定)。なぜこれが行われたのですか?
現在実行中のタスクアドレス(struct task_struct
)のアドレスをカーネルスタックに配置できなかったのはなぜですか?
thread_infoが必要な理由は、スラブアロケーターを使用してtask_structにメモリを割り当てているためです。今、あなたはこれらの間の関係は何ですか?
スラブアロケーターがどのように機能するかを理解する必要があることを理解するには。
Slab Allocatorがないと、カーネル開発者は特定のプロセスのカーネルスタック内のtask_structにメモリを割り当てて、簡単にアクセスできるようにすることができます。 Slab Allocatorの登場により、メモリはSlab Allocatorによって決定されたtask_structに割り当てられます。したがって、Slab Allocatorを使用すると、特定のプロセスのカーネルスタックではなく、別の場所に保存されますtask_struct。ここで、カーネル開発者はthread_infoを導入し、task_structが存在する場所へのポインターをその中に配置しました。そしてそれが私たちがthread_infoと一緒に暮らさなければならない理由です。
Slab Allocatorについては、RobertLoveの著書LinuxKernelDevelopmentで読むことができます。