Linux 任务结构存储在哪里?

Linux 任务结构存储在哪里?,linux,process,kernel,task,Linux,Process,Kernel,Task,Task_struct用于按内核保存有关进程的必要信息。由于这种结构,内核可以挂起一个进程,并在一段时间后继续执行它的实现。但我的问题是:这个任务结构存储在内存中的什么地方(我读过关于内核堆栈的文章,它是在虚拟地址空间的内核空间中吗?)?在挂起进程后,内核在哪里保留指向该结构和该结构的指针 如果您能在所描述的地方提供一些参考资料,我将不胜感激 另外,我忘了说这个问题是关于Linux内核的。处理线程和进程上下文的内核结构依赖于操作系统。通常,它们将从非分页池中分配,用于管理它们的指向它们的指针集合

Task_struct用于按内核保存有关进程的必要信息。由于这种结构,内核可以挂起一个进程,并在一段时间后继续执行它的实现。但我的问题是:这个任务结构存储在内存中的什么地方(我读过关于内核堆栈的文章,它是在虚拟地址空间的内核空间中吗?)?在挂起进程后,内核在哪里保留指向该结构和该结构的指针

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


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

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

Linux内核通过kmem\u缓存设施分配任务结构。例如,在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)就是这样工作的:

在PowerPC中(arch/PowerPC/include/asm/current.h):


您可以使用来轻松地浏览内核源代码。

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


如果我们谈论特定于0x86体系结构,那么在任务内核堆栈的末尾,我们有thread\u info struct,它本质上存储/指向任务\u struct指针。而task_struct具有内核堆栈指针,可以减少8kb以获得线程信息结构。

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

本主题考虑了Linux。LXR链接中的链接都返回内部服务器错误。
static __always_inline struct task_struct *get_current(void)
{
    return percpu_read_stable(current_task);
}
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;
}