Task_struct用於保存內核有關進程的必要信息。由於這種結構,內核可以暫停一個進程,並在一段時間後繼續執行。但我的問題是:這個task_struct存儲在內存中的位置(我已經讀過關於內核堆棧,是在虛擬地址空間的內核空間中的那個?)?在掛起進程之後,內核在哪裏保持指向該結構和該結構的指針?task_struct存儲在哪裏?
如果您在描述資源的地方提供一些參考資料,我將不勝感激。
PS。我忘了說這個問題是關於Linux內核的。
Task_struct用於保存內核有關進程的必要信息。由於這種結構,內核可以暫停一個進程,並在一段時間後繼續執行。但我的問題是:這個task_struct存儲在內存中的位置(我已經讀過關於內核堆棧,是在虛擬地址空間的內核空間中的那個?)?在掛起進程之後,內核在哪裏保持指向該結構和該結構的指針?task_struct存儲在哪裏?
如果您在描述資源的地方提供一些參考資料,我將不勝感激。
PS。我忘了說這個問題是關於Linux內核的。
處理線程和進程上下文的內核結構取決於操作系統。通常情況下,它們將從非頁面緩衝池中分配,這將是用於管理它們的指針集合。
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來輕鬆探索內核源代碼。
task_struct是在slab分配器的幫助下分配的。內核中的每個任務都有8kb或4kb的內核堆棧,永遠不會增加或減少。
如果我們專門討論0x86體系結構,那麼在任務內核堆棧的末尾,我們有thread_info結構,它本質上存儲/指向task_struct指針。而task_struct有內核堆棧指針,它可以減少8kb來獲得線程信息結構。
在這個話題中Linux的考慮。 – Allok