如何通过 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”?的主要内容,如果未能解决你的问题,请参考以下文章