2012-05-15 50 views
3

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

如果您在描述资源的地方提供一些参考资料,我将不胜感激。

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

回答

0

处理线程和进程上下文的内核结构取决于操作系统。通常情况下,它们将从非页面缓冲池中分配,这将是用于管理它们的指针集合。

+0

在这个话题中Linux的考虑。 – Allok

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(弓/ 86 /包括/ ASM/current.h):

static __always_inline struct task_struct *get_current(void) 
{ 
    return percpu_read_stable(current_task); 
} 

和PowerPC的(弓/ PowerPC的/包括/ 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; 
} 

您可以使用LXR来轻松探索内核源代码。

1

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

如果我们专门讨论0x86体系结构,那么在任务内核堆栈的末尾,我们有thread_info结构,它本质上存储/指向task_struct指针。而task_struct有内核堆栈指针,它可以减少8kb来获得线程信息结构。