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;
}