Linux 2.6カーネル以前は、struct task_struct
各プロセスのカーネルスタックの末尾に存在していました。概念はありませんthread_info struct
。ただし、Linux 2.6カーネルでは、プロセスをtask_struct
カーネルスタックの最後に配置するのではなく、最後に配置しますthread_info struct
。 thread_info 構造には、task_struct
この構造へのポインタが含まれています。
thread_info
どの構造を導入する必要がありますか?task_struct
プロセスカーネルスタックの最後にあるifを使用して、stack pointer
この構造に直接アクセスできます。task_struct
2.6カーネルではtask_struct
動的割り当てが使用されますslab_allocator
。 2.6 カーネル以前は静的に割り当てられていましたか?
答え1
なぜこれが起こるのかわかりません。ただし、git blame
ファイルにアクションを実行し、変更を導入したコミットを見つけると、簡単に見つけることができます。通常、コミットメッセージはコミットされた変更を非常に詳細に説明します。
答え2
私たちに必要な理由はスレッド情報メモリを割り当てるからです。作業構造使用プレートディスペンサー。これで、これが何に関連しているのか尋ねることができます。
これを理解するには、Slab Allocatorのしくみを理解する必要があります。
Slab Allocatorがないと、カーネル開発者は特定のプロセスのカーネルスタックにtask_structのメモリを割り当てて、簡単にアクセスできます。 Slab Allocatorの出現により、メモリはSlab Allocatorによって決定されたtask_structに割り当てられます。したがって、Slabアロケータを使用すると、特定のプロセスのカーネルスタック以外の場所にtask_structを保存できます。カーネル開発者はthread_infoを導入し、task_structがある場所へのポインタを入れました。したがって、私たちはスレッド情報代わりに、プロセスのカーネルスタックから作業構造。これが私たちがthread_infoを受け入れなければならない理由です。
Robert Loveの本 Linux Kernel DevelopmentでSlab Allocatorについて読むことができます。