在 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
。
背景: 我是 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
。