Linux カーネルは、kmem_cache 機能を介して task_struct を割り当てます。たとえば fork.c には、タスク構造体の割り当てを担当するコードがあります。
#define alloc_task_struct_node(node) \
kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node)
static struct kmem_cache *task_struct_cachep;
現在のスレッドへのポインタが格納される場所は、アーキテクチャに依存します。たとえば、x86 (arch/x86/include/asm/current.h) では次のように動作します。
static __always_inline struct task_struct *get_current(void)
{
return percpu_read_stable(current_task);
}
PowerPC (arch/powerpc/include/asm/current.h) の場合:
static inline struct task_struct *get_current(void)
{
struct task_struct *task;
__asm__ __volatile__("ld %0,%1(13)"
: "=r" (task)
: "i" (offsetof(struct paca_struct, __current)));
return task;
}
カーネル ソースを簡単に調べるために、 Elixir クロス リファレンスを使用できます。