在 linux 最新内核中如何通过 'thread_info' 访问 'task_struct'?

How 'task_struct' is accessed via 'thread_info' in linux latest kernel?

背景: 我是 linux 内核领域的初学者。我刚刚通过阅读 Robert Love 的书 'Linux kernel Development - Third Edition' 开始了解 Linux 内核。本书大部分讲解都是基于Linux kernel 2.6.34.

因此,很抱歉,如果这是重复的问题,但我在堆栈溢出中找不到与此相关的任何信息。

问题: 我从书中了解到,linux 中的每个线程都有一个名为 'thread_info' 的结构,该结构具有指向其 process/task.

的指针

这 'thread_info' 存储每个活动线程的内核堆栈的末尾。

并且 'thread_info' 有一个指向其所属任务的指针,如下所示。

struct thread_info {
    
    struct task_struct *task;
    ...
};

但是当我在最新的 linux 代码中检查相同的结构时,我看到了一个非常不同的 thread_info 结构,如下所示。 (https://elixir.bootlin.com/linux/v5.16-rc1/source/arch/x86/include/asm/thread_info.h)。里面没有'task_struct'。

struct thread_info {
    
    unsigned long       flags;      /* low level flags */
    unsigned long       syscall_work;   /* SYSCALL_WORK_ flags */
    u32                 status;     /* thread synchronous flags */
    #ifdef CONFIG_SMP
    u32                 cpu;        /* current CPU */
    #endif

};

我的问题是,如果'thread_info'结构在这里没有它的相关任务结构,那么它如何找到关于它的地址的信息space?

此外,如果您知道有关最新 linux 内核的好书,请提供链接给我。

指向当前 task_struct 对象的指针以依赖于体系结构的方式存储。在 x86 上,它存储在每个 CPU 变量中:

DECLARE_PER_CPU(struct task_struct *, current_task);

(在arch/x86/include/asm/current.h).

要了解当前 task_struct 是如何存储在特定架构 and/or 上的,特别是内核版本,只需搜索 current 宏的实现:正是该宏负责返回指针到当前进程的task_struct