【问题标题】:Where are DECLARE_PER_CPU variables stored in kernel内核中存储的 DECLARE_PER_CPU 变量在哪里
【发布时间】:2019-05-26 21:10:58
【问题描述】:

我正在尝试了解当前宏如何检索进程的 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指针

谁能解释一下。感谢您的时间和耐心

【问题讨论】:

    标签: c linux process linux-kernel macros


    【解决方案1】:

    根据我将在下面提到的来源的理解,您的问题的答案是这样的:

    1. 变量已经由 DEFINE_PER_CPU 宏定义,使用 DECLARE_PER_CPU 可以告诉编译器正在进行外部引用。 current_struct 变量存储的部分取决于 CONFIG_SMP 是否在 32 位架构上定义,如果已定义,它将位于 ".data.percpu" em> 部分,否则,它将位于 ".data" 部分。 在 64 位架构中,它将始终位于 ".data.percpu"。 DECLARE_PER_CPU 声明的变量将存储在 stack 中。

    2. 让我说:

    在启动时,按 ".data.percpu" 部分的大小分配一个区域 + PERCPU_ENOUGH_ROOM 次 NR_CPUS。 __per_cpu_offset[] 数组保存了两者之间的差异 ".data.percpu" 部分和数据实际所在的位置 存储。 __per_cpu_offset[0] 保存变量的差异 分配给 cpu 0,__per_cpu_offset[1] 持有不同的 变量到 cpu 1,依此类推。

    所以,它取决于“per cpu”变量的其他声明的顺序

    1. 宏 per_cpu_read_stable 用于读取 "current_task" per-cpu 变量。

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 1970-01-01
      • 2010-09-18
      • 2011-12-12
      • 2017-03-26
      • 2010-10-02
      • 1970-01-01
      • 2011-06-07
      • 2018-02-01
      相关资源
      最近更新 更多