task_struct存储在哪里?

时间:2012-05-15 16:03:56

标签: linux process kernel task

Task_struct用于通过内核保存有关进程的必要信息。由于该结构,内核可以暂停进程,并在一段时间后继续执行。但我的问题是:这个task_struct存储在内存中的哪个位置(我读过有关内核堆栈的内容,是在虚拟地址空间的内核空间中的那个?)?内核在挂起进程后保留指向该结构和该结构的指针在哪里?

如果您对描述它的资源进行一些参考,我将不胜感激。

PS。我忘了说这个问题是关于Linux内核的。

4 个答案:

答案 0 :(得分:4)

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 Cross Reference轻松浏览内核源代码。

答案 1 :(得分:1)

task_struct是在slab分配器的帮助下分配的。内核中的每个任务都有8kb或4kb的内核堆栈,它永远不会增加或减少。

如果我们特定于0x86架构,那么在任务内核堆栈结束时,我们有thread_info结构,它实质上存储/指向task_struct指针。而task_struct有内核堆栈指针,可以减少8kb来获取线程信息结构。

答案 2 :(得分:0)

处理线程和进程上下文的内核结构是依赖于操作系统的。通常,它们将从非分页池中分配,因为它们将用于管理它们的指针集合。

答案 3 :(得分:0)

从虚拟内存系统的角度来看,task_struct由Slab分配器分配,因此它位于内核空间中。更具体地说,平板存储器可以直接映射到缓存中。