我试图了解当前宏如何检索流程的struct task_struct。
我试图了解x86架构,并在探究了内核源代码之后,执行了以下代码:
#include <linux/compiler.h>
#include <asm/percpu.h>
#ifndef __ASSEMBLY__
struct task_struct;
DECLARE_PER_CPU(struct task_struct *, current_task);
static __always_inline struct task_struct *get_current(void)
{
return percpu_read_stable(current_task);
}
#define current get_current()
#endif /* __ASSEMBLY__ */
#endif /* _ASM_X86_CURRENT_H */
任何人都可以解释。感谢您的时间和耐心
答案 0 :(得分:2)
根据我从下面将提到的消息来源中了解到的信息,您的问题的答案是这样的:
变量已经由 DEFINE_PER_CPU 宏定义,并且使用 DECLARE_PER_CPU 告诉编译器正在建立外部引用。 current_struct 变量的存储部分取决于 CONFIG_SMP 是否在32位拱门上定义,如果定义的话,将在“。data.percpu” em>部分,否则将位于“。data” 部分。 在64位arch中,它将始终位于“。data.percpu” 。 由 DECLARE_PER_CPU 声明的变量将存储在堆栈中。
让我qoute:
在启动时,将根据“。data.percpu” 部分的大小分配一个区域+ PERCPU_ENOUGH_ROOM 乘以 NR_CPUS 。 __ per_cpu_offset [] 数组保留了 “。data.percpu” 部分以及数据实际所在的位置 存储。 __ per_cpu_offset [0] 保留变量的差异 分配给cpu 0的 __ per_cpu_offset [1] 保留了 cpu 1的变量,依此类推。
因此,它根据“每个CPU” 变量的其他声明的顺序