2012-05-15 51 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來獲得線程信息結構。