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