DECLARE_PER_CPU变量在哪里存储在内核中

时间:2018-12-29 10:37:05

标签: c linux process linux-kernel macros

我试图了解当前宏如何检索流程的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 */
  1. 在DECLARE_PER_CPU中声明的变量在哪里存储在内存中。
  2. 它们在固定位置还是在CPU寄存器中?
  3. 我仍然无法获得,这将如何给task_struct指针

任何人都可以解释。感谢您的时间和耐心

1 个答案:

答案 0 :(得分:2)

根据我从下面将提到的消息来源中了解到的信息,您的问题的答案是这样的:

  1. 变量已经由 DEFINE_PER_CPU 宏定义,并且使用 DECLARE_PER_CPU 告诉编译器正在建立外部引用。 current_struct 变量的存储部分取决于 CONFIG_SMP 是否在32位拱门上定义,如果定义的话,将在“。data.percpu” em>部分,否则将位于“。data” 部分。 在64位arch中,它将始终位于“。data.percpu” 。 由 DECLARE_PER_CPU 声明的变量将存储在堆栈中。

  2. 让我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” 变量的其他声明的顺序

  1. per_cpu_read_stable宏用于读取每个cpu变量“ current_task”