如何通过 linux 最新内核中的“thread_info”访问“task_struct”?

Posted

技术标签:

【中文标题】如何通过 linux 最新内核中的“thread_info”访问“task_struct”?【英文标题】:How 'task_struct' is accessed via 'thread_info' in linux latest kernel? 【发布时间】:2021-11-20 05:55:41 【问题描述】:

背景: 我是linux内核领域的初学者。我刚刚通过阅读 Robert Love 的《Linux 内核开发 - 第三版》一书开始了解 Linux 内核。本书大部分讲解都是基于Linux kernel 2.6.34。

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

问题: 我从书中了解到,linux中的每个线程都有一个名为'thread_info'的结构,它有指向它的进程/任务的指针。

这个 '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'结构在这里没有其相关的任务结构,那么它如何找到有关其地址空间的信息?

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

【问题讨论】:

【参考方案1】:

指向当前task_struct 对象的指针以架构相关的方式存储。在 x86 上,它存储在每个 CPU 变量中:

DECLARE_PER_CPU(struct task_struct *, current_task);

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

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

【讨论】:

以上是关于如何通过 linux 最新内核中的“thread_info”访问“task_struct”?的主要内容,如果未能解决你的问题,请参考以下文章

如何参与linux 内核开发

详解如何在 CentOS 7 中安装或升级最新的内核

如何在linux中查询内核版本的路径??请高手们帮帮忙!!

如何通过linux内核中的c指针覆盖x86`movq`指令的操作数值

树莓派Linux内核编译选项如何开启TPM 2.0

centos7升级内核